4.1 @禁用

现在让我们看一下 JUnit 框架的一些非常有用和流行的注释。第一个注释允许您关闭特定测试,以便 JUnit 不调用它。如果您注意到测试无法正常工作,或者您更改代码并且测试意外中断,则需要它。

正如我之前所写,99% 的测试都没有人支持,所以它们迟早会被禁用。因此,此注释是有用注释列表中的第一个。

考虑她的例子:

public class AppTest {

    @Disabled("Test is temporarily disabled. True, true")
    @Test
    void testOnDev(){
        System.setProperty("ENV", "DEV");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
    }

    @Test
    void testOnProd(){
     System.setProperty("ENV", "PROD");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
    }
}

在上面的示例中,testOnDev()不会调用该方法。顺便说一下,注解@Disabled可以写在类声明之前,那么它的所有方法都将被忽略。

@Disabled("Temporarily turned off the test, we will fix it by May 2001")
public class AppTest {
    @Test
    void testOnDev(){
        System.setProperty("ENV", "DEV");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
    }

    @Test
    void testOnProd(){
     System.setProperty("ENV", "PROD");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
    }
}

4.2 @嵌套

JUnit 允许您在嵌套类上调用测试方法。我的意思是嵌套测试类。你不会经常遇到它们,但有这种可能性,所以你需要了解它是什么。

要在声明之前调用嵌套类的方法,您需要编写一个注解@Nested。例子:

public class AppTest {
    @Nested
    public class DevStagingEnvironment {
    @Test
        void testOnDev(){
            System.setProperty("ENV", "DEV");
            Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
        }
   }

    @Nested
    public class ProductionEnvironment {
        @Test
        void testOnProd(){
           System.setProperty("ENV", "PROD");
           Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
        }
   }
}

可以在官方文档中找到更多详细信息。

4.3 @ExtendWith

另一个有用的注解是@ExtendWith. 您很可能会经常见到她,所以让我们更详细地了解一下她。

JUnit 是一个强大的框架,允许您编写各种插件(扩展)以灵活定制您的工作。一些扩展可以收集有关测试的统计信息,其他可以模拟内存中的文件系统,其他可以模拟在 Web 服务器内部工作,等等。

如果您的代码在一个框架(例如 Spring)中运行,那么几乎总是这个框架会管理您代码中对象的创建和配置。因此,一个专门的测试插件是必不可少的。例子:

示例 1.扩展WebServerExtension传递给被调用的测试方法URL以便正常工作。

@Test
@ExtendWith(WebServerExtension.class)
void getProductList(@WebServerUrl String serverUrl) {
    WebClient webClient = new WebClient();
    // Use WebClient to connect to web server using serverUrl and verify response
    assertEquals(200, webClient.get(serverUrl + "/products").getResponseStatus());
}

这就是测试通常如何开始测试与 Spring 框架一起工作的代码:

@ExtendWith(SpringExtension.class)
@ExtendWith(MockitoExtension.class)
class TestServiceTest {

    @MockBean
    TestService service;

    @Test
    void test() {
        assertNotNull(service); // Test succeeds
    }
}

SpringExtension创建 Spring 框架的测试版本,但MockitoExtention允许您创建假对象。假对象是一个非常有趣的话题,我们肯定会谈到它,但稍后会谈。

4.4 @超时

让我们用一个小而有趣的注解来结束这个讲座@Timeout。它允许您设置运行测试的时间。如果测试花费的时间超过注释中指定的时间,则认为失败。

class TimeoutDemo {
    @Test
    @Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
    void failsIfExecutionTimeExceeds100Milliseconds() {
        // test will fail if it takes more than 100 milliseconds
    }
}

我们的讲座到此结束。