在编写JUnit测试用例时,在没有SpringContext的情况下使用SpringRunner是一种好习惯吗?

时间:2019-02-06 10:09:56

标签: java junit mockito junit4 springrunner

我尝试过用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));        
    }

}

测试用例工作正常。

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

  

即使您没有在测试中使用SpringContext并模拟所有内容,您仍在使用SpringRunner。

现在,以下是我的担忧:

  1. 测试用例怎么了?

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

  3. 我该如何纠正?

2 个答案:

答案 0 :(得分:1)

  

测试用例怎么了?

我认为他们想要您做的是编写一个Spring Web层测试。这不是Spring MVC测试/ spring-boot测试。因为您不将控制器作为弹簧加载资源进行测试。您将其作为简单的Java类进行测试。那将无法证明它是否正确地充当Spring控制器。您将无法测试以下功能:

  • 春季资源注入
  • 请求分派和验证
  

我该如何纠正?

您必须编写spring MVC测试并使用MockMvcRestTemplate来验证您的控制器。例如;

@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
    }

}

使用模拟嘲笑并不是最坏的主意,但是您可以使用自动连接的@MockBean

如果这是spring-boot,您将具有更大的灵活性。看看以下资源。

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

答案 1 :(得分:0)

您有抱怨,因为您不需要在测试中使用spring的测试功能。 您的测试是纯单元测试。

因此,如果您要删除@RunWith(SpringRunner.class),则测试不会改变。只需放在@ExtendWith(MockitoExtension.class)

SpringRunner将为您初始化spring上下文,以测试您可以使用以下注释来注入或模拟应用程序片段:

  • @MockBean
  • @Autowired
  • 等。