Spring 引导休息控制器的 Junit

Junit for Spring Boot Rest Controller

如何在 Spring Boot

中为下面的 RestController 编写有意义的 Junit
@GetMapping("/api")
    public String m2(String process ) {
        
        if( process.equalsIgnoreCase("Y"))
        {
            jobs.start();
        } else if(process.equalsIgnoreCase("N"))
        {
            jobs.sendEmail();
        }
    

在我看来一个好的单元测试应该是简洁,能够覆盖大部分(如果不是全部)代码分支,验证副作用,快速可靠易于阅读.

假设您正在使用 JUnit 5Mockito,像这样的东西将实现以上所有:

@ExtendWith(MockitoExtension.class)
class MyControllerTests {

  @Mock
  private Jobs jobs;
  private MyController myController;

  @BeforeEach
  public void setUp() {
    myController = new MyControllerImpl(jobs);
  }

  @Test
  void affirmativeProcessShouldStartJobs() {
    myController.m2("Y");
    verify(jobs).start();
  }

  @Test
  void negativeProcessShouldSendEmail() {
    myController.m2("N");
    verify(jobs).sendEmail();
  }

  //...add more tests here, eg.: what do you expect given null input?

}

P.S.: 您可以明显提高此单元测试的可读性,因为您比我们任何人都更了解此代码在您的应用程序上下文中的含义。此外,您应该在 m2(String) 返回值上添加断言(我们无法从您的代码片段中看到)。

如果您想测试 API 是否确实公开并且可以通过 HTTP 联系,那将是 End-to-End 测试而不是单元测试,我建议不要用 JUnit 来做,而是使用用这种 black-box 测试记如 Cucumber.