当前位置: 首页 > 知识库问答 >
问题:

为什么TestContext.get实例()是null在beforTestclass和在测试执行侦听器后的测试类方法?

芮建茗
2023-03-14

我有使用名为Server的类实例的TestNG测试。这个实例是在我的测试中使用SpringTest框架自动连接的。正如这里所建议的,我希望通过实现TestExecutionListener接口,在beforeTestClass()和afterTestClass)方法中外部化服务器的启动和停止。为此,我首先使用Java反射获取测试类中的Server字段,然后分别在beforeTestClass()和afterTestClass)方法中调用start和stop。作为参数传递给这些方法的TestContext封装了测试的实例。然而,TestContext。getInstance为空,这意味着我无法在运行时获取字段(服务器对象)的值。

这里有一个例子:

public class Server
{
    public void start()
    {
        System.out.println("Started");
    }

    public void stop()
    {
        System.out.println("Stopped.");
    }
}

@Configuration
public class ServerConfig
{
    @Bean
    public Server server()
    {
        return new Server();
    }
}

public class ServerStartStopListener implements TestExecutionListener, Ordered
{
    @Override
    public void afterTestClass(TestContext testContext)
    {
        //testContext.getTestInstance() is null                                                                                                                                    
    }

    @Override
    public void afterTestMethod(TestContext testContext){}

    @Override
    public void beforeTestClass(TestContext testContext)
    {
        //testContext.getTestInstance() is null                                                                                                                                    
    }

    @Override
    public void beforeTestMethod(TestContext testContext){}

    @Override
    public void prepareTestInstance(TestContext testContext){}

    @Override
    public int getOrder()
    {
        return 6000;
    }
}

@ContextConfiguration(classes={ServerConfig.class})
@TestExecutionListeners(listeners=ServerStartStopListener.class, mergeMode = MergeMode.MERGE_WITH_DEFAULTS)
public class AppTest extends AbstractTestNGSpringContextTests
{
    @Autowired
    private Server server;

    @Test
    public void test()
    {
        System.out.println("Server should be started at this point");
   }
}

有解决方法。这建议从测试实例的ApplicationContext中自动连接bean。另一种方法是使用beforeTestMethod()和afterTestMetho()方法。然而,它们不适合我的需要。

按照org.springframework.test.context中的beforeTestClass()和afterTestClass)方法。TestContextManager,上述行为似乎是有意的。有人能解释为什么吗?

共有1个答案

洪博涛
2023-03-14

此问题与10184602有关。有关详细信息,请参阅那里的讨论。

但是回答你的问题...

按照org.springframework.test.context中的beforeTestClass()和afterTestClass)方法。TestContextManager,上述行为似乎是有意的。有人能解释为什么吗?

根据Javadoc,TestContext封装了执行测试的上下文,与实际使用的测试框架无关。语义学在这里很重要:TestContext本身并不封装测试实例。例如,在TestEx的后Testclass()方法中,您无权访问测试实例,因为这些方法在设计上仅限于与测试类交互。这些义学是必需的,以便Spring TestContext Framework可以与TestNG和JUnit一起使用。

我没试过这个,但是理论上...作为一种变通办法,您可以考虑以下几点:

    < li >从< code > AbstractTestExecutionListener 扩展。 < li >重写< code > prepare test instance(),将测试实例存储在您的自定义< code > TestExecutionListener 的字段中,并执行您的开始代码。 < li >重写< code > afterest class(),并使用在< code > preparestinstance()中设置的测试实例引用来执行停止代码。

当然,对于TestNG套件中“测试方法”执行的顺序,您可能需要小心。我说“测试方法”是因为许多开发人员对TestNG的运行时语义感到困惑,这些语义涉及对实际测试方法的依赖性、方法之前的依赖性等。如果有疑问,请打开DEBUGorg.springframework.test的日志记录。上下文,并验证TestExecutionListener中的方法是否在您期望的情况下(即,相对于“测试方法”的顺序)被执行(即,不是无序)。

祝好

Sam(Spring test context框架的作者)

p. s.您的自定义TestEx

 类似资料:
  • 方法正在传递,这太好了,但是为什么的结果会出现在库测试结果中,我不明白。我怎么才能避免呢? 我在这里列出了和的完整代码。

  • 我有两个屏幕..首先是闪屏,在这里我借助firebase.auth()检查用户是否已经存在。onAuthStateChanged侦听器。如果用户为空,它将转到另一个firebase.auth()的登录屏幕。onAuthStateChanged侦听器用于在电话验证后获取用户,如果用户之前未注册,则将用户移至UserDetails屏幕以获取更多用户信息,或者移至主屏幕..同样的检查也在闪屏上进行,以确

  • 本文向大家介绍什么是测试用例?相关面试题,主要包含被问及什么是测试用例?时的应答技巧和注意事项,需要的朋友参考一下 测试用例是执行测试的依据,把测试系统的操作1197步骤用文档的形式描述出来 (1)测试用例是为达到最佳的测试效果或高效的揭露隐藏的错误,而精心设计的少量测试数据,包括测试输入、执行条件和预期的结果,实际结果 (2)测试用例是执行的最小实体。 (3)测试用例是测试工作的指导,是软件测试

  • 有人对这种情况有什么建议吗?额外信息:我用的是liquidbase,panache entity,Junity。

  • 我正在尝试学习python来处理一个测试项目。是否有一种方法可以在python测试框架中实现类似功能的TestNG侦听器。 侦听器有诸如OnTestFailure()、OnTestSuccess、OnStart()等方法,当您想要做某些事情时,这些方法非常有用。 比方说,一个测试用例失败了,您想执行一些操作,比如截图。然后你可以只在一个地方写,而不是在每个测试方法中都写。

  • 22.13.1.执行测试 测试从main构建过程中分离出来的,运行在一个单独的JVM中执行.Test任务允许控制这些如何发生. 有许多属性用于控制测试过程如何启动.这包括使用诸如系统属性,JVM参数和Java可执行文件。 可以指定是否要并行执行测试.Gradle通过同时运行多个测试进程提供并行执行测试.每个测试进程在同一时间只能执行一个测试,为了充分利用这一特性,一般不需要为tests任务做什么特