Java 在编写JUnit测试用例时,在没有SpringContext的情况下使用SpringRunner是否是一种良好的做法?

Java 在编写JUnit测试用例时,在没有SpringContext的情况下使用SpringRunner是否是一种良好的做法?,java,junit,mockito,junit4,springrunner,Java,Junit,Mockito,Junit4,Springrunner,我用mockito尝试了junit,并为编码练习编写了一些测试用例 下面是我编写的测试用例: @RunWith(SpringRunner.class) public class TransactionControllerTest { @Mock TransactionService transactionServiceMock; @InjectMocks TransactionController transactionController; Tra

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

}
@RunWith(SpringRunner.class)
公共类事务控制器测试{
@嘲弄
TransactionService transactionServiceMock;
@注射模拟
TransactionController TransactionController;
TransactionRequest txn=新交易请求(“123.34”、“2018-11-28T23:32:36.312Z”);
@试验
public void testSaveTxn()引发异常{
Mockito.when(transactionServiceMock.saveTxn(Mockito.any(TransactionRequest.class)),然后返回(true);
ResponseEntity ResponseEntity=transactionController.saveTxn(null,txn);
assertTrue(responseEntity.getStatusCode().equals(HttpStatus.CREATED));
}
@试验
public void testGetStats()引发异常{
StatsResponse sr=新的StatsResponse(“0.00”、“0.00”、“0.00”、“0.00”和“0L”);
Mockito.when(transactionServiceMock.getStats()).thenReturn(sr);
ResponseEntity ResponseEntity=(ResponseEntity)transactionController.getStats(null);
System.out.println(“sr response=“+responseEntity.getBody());
assertTrue(responseEntity.getBody().equals(sr));
}
@试验
public void testDelete()引发异常{
Mockito.doNothing().when(TransactionServiceLock).delete();
ResponseEntity ResponseEntity=(ResponseEntity)transactionController.deleteTxn(null);
System.out.println(“sr response=“+responseEntity.getBody());
assertTrue(responseEntity.getStatusCode().equals(HttpStatus.NO_CONTENT));
}
}
测试用例运行良好

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

即使在测试中没有使用SpringContext,您也在使用SpringRunner,并且模仿了一切

以下是我关注的问题:

  • 测试用例有什么问题

  • 上述拒绝理由的含义是什么

  • 我该怎么纠正呢


  • 您有投诉,因为您的测试中不需要spring的测试功能。 您的测试是纯单元测试

    因此,如果您将删除
    @RunWith(SpringRunner.class)
    测试将不会更改任何内容。只需将
    @extendedwith(MockitoExtension.class)

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

    • @MockBean
    • @Autowired
    • 等等
    测试用例有什么问题

    我认为他们想要你做的是编写一个SpringWeb层测试。这不是SpringMVC测试/SpringBoot测试。因为您没有将控制器作为弹簧加载的资源进行测试。您可以将其作为一个简单的java类进行测试。这并不能证明它是否能正确地作为Spring控制器运行。您将无法测试以下功能:

    • 春季资源注入
    • 请求分派和验证
    我该怎么纠正呢

    您必须编写一个SpringMVC测试,并使用
    MockMvc
    RestTemplate
    来验证您的控制器。比如,

    @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 mocks并不是最糟糕的主意,但是您可以使用auto-wired
    @MockBean
    s

    如果这是spring引导,您将拥有更大的灵活性。请查看以下资源


    SpringRunner需要上下文。如果您使用的是Mockito,请使用MockitoJUnitRunner。很好的解释!!很高兴它有用。