Является ли хорошей практикой использование SpringRunner без SpringContext при написании тестовых случаев JUnit? - PullRequest
0 голосов
/ 06 февраля 2019

Я попробовал junit с mockito и написал несколько тестовых примеров для упражнения по кодированию.

Вот тестовый пример, который я написал:

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

}

Тестовые случаи работали нормально.

Но мое приложение было отклонено с указанием следующей причины:

Вы использовали SpringRunner, даже если вы не используете SpringContext в тестах, и дразнили все.

Теперь, мои проблемы следующие:

  1. Что не так с контрольными примерами?

  2. Что означает вышеуказанная причина отказа?

  3. Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Что не так с контрольными примерами?

Думаю, они хотят, чтобы вы написали весенний тест веб-слоя.Это не тест MVC Spring / Spring-boot.Потому что вы не тестируете контроллер как подпружиненный ресурс.Вы тестируете это как простой Java-класс.Это не докажет, правильно ли он ведет себя как контроллер Spring.Вы не сможете протестировать такие функции, как:

  • впрыск ресурса пружины
  • отправка и проверка запросов

Как я могу исправитьчто?

Вы должны написать пружинный тест MVC и использовать 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 - не самая плохая идея, но вы могли бы использовать автоматическую проводную @MockBean s.

Если это подпружиненная загрузка, у вас будетбольше гибкости.Посмотрите следующие ресурсы.

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

0 голосов
/ 06 февраля 2019

У вас есть жалоба, потому что вам не нужны тестовые функции Spring в вашем тесте.Ваш тест является чистым модульным тестом.

Так что если вы удалите @RunWith(SpringRunner.class), то ничего не изменится для вашего теста.Просто поместите туда @ExtendWith(MockitoExtension.class)

SpringRunner, чтобы инициализировать контекст пружины для вашего теста, который вы могли бы внедрить или смоделировать фрагментом приложения, используя следующие аннотации:

  • @MockBean
  • @Autowired
  • и т. Д.
...