gpt4 book ai didi

java - 编写 JUnit 测试用例时使用 SpringRunner 而不使用 SpringContext 是一个好习惯吗?

转载 作者:行者123 更新时间:2023-12-02 10:17:48 26 4
gpt4 key购买 nike

我用mockito尝试了junit,并为编码练习编写了一些测试用例。

这是我编写的测试用例:

@RunWith(SpringRunner.class)
public class TransactionControllerTest {

@Mock
TransactionService transactionServiceMock;

@InjectMocks
TransactionController transactionController;

TransactionRequest txn = new TransactionRequest("123.34", "2018-11-28T23:32:36.312Z");

@Test
public void testSaveTxn() throws Exception {
Mockito.when(transactionServiceMock.saveTxn(Mockito.any(TransactionRequest.class))).thenReturn(true);
ResponseEntity<?> responseEntity = transactionController.saveTxn(null, txn);
assertTrue(responseEntity.getStatusCode().equals(HttpStatus.CREATED));
}

@Test
public void testGetStats() throws Exception {
StatsResponse sr = new StatsResponse("0.00", "0.00", "0.00", "0.00", 0L);
Mockito.when(transactionServiceMock.getStats()).thenReturn(sr);
ResponseEntity<StatsResponse> responseEntity = (ResponseEntity<StatsResponse>) transactionController.getStats(null);
System.out.println("sr response = "+responseEntity.getBody());
assertTrue(responseEntity.getBody().equals(sr));
}

@Test
public void testDelete() throws Exception {
Mockito.doNothing().when(transactionServiceMock).delete();
ResponseEntity<HttpStatus> responseEntity = (ResponseEntity<HttpStatus>) transactionController.deleteTxn(null);
System.out.println("sr response = "+responseEntity.getBody());
assertTrue(responseEntity.getStatusCode().equals(HttpStatus.NO_CONTENT));
}

}

测试用例运行良好。

但是我的申请被拒绝,原因如下:

You were using SpringRunner even though you are not using SpringContext in the tests, and mocking everything.

现在,以下是我的担忧:

  1. 测试用例有什么问题?

  2. 上述拒绝原因是什么意思?

  3. 我该如何纠正这个问题?

最佳答案

What's wrong with the test cases?

我认为他们希望你做的是编写一个 Spring Web 层测试。这不是 spring MVC 测试/spring-boot 测试。因为您没有将 Controller 作为 Spring 加载的资源进行测试。您将其作为一个简单的 java 类进行测试。这并不能证明它作为 Spring Controller 的行为是否正确。您将无法测试以下功能:

  • Spring资源注入(inject)
  • 请求分派(dispatch)和验证

How can i correct that?

您必须编写 Spring MVC 测试并使用 MockMvcRestTemplate 来验证您的 Controller 。例如;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = YourContext.class)
@WebAppConfiguration
public class MyWebTests {

@Autowired
private WebApplicationContext wac;

private MockMvc mockMvc;

@Before
public void setup() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
}

@Test
public void foo() throws Exception {
mockMvc.perform(get("/status"));
//and verification
}

}

使用mockito模拟并不是最糟糕的主意,但你可以使用自动连接的@MockBeans。

如果这是 spring-boot,你将拥有更多的灵 active 。查看以下资源。

https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html https://spring.io/guides/gs/testing-web/

关于java - 编写 JUnit 测试用例时使用 SpringRunner 而不使用 SpringContext 是一个好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54551001/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com