MockBean не вводится в тесте контроллера MVC - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь проверить свой контроллер в изоляции от контекста приложения Spring.

Вот мой контроллер

@RestController
public class AddressesController {

    @Autowired
    service service;

    @GetMapping("/addresses/{id}")
    public Address getAddress( @PathVariable Integer id ) {
        return service.getAddressById(id);
    }
}

Мой сервисный интерфейс

public interface service {
    Address getAddressById(Integer id);
}

А вот и мой тестовый класс

@ExtendWith(SpringExtension.class)
@WebMvcTest
public class AddressControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    service myService;

    @Test
    public void getAddressTest() throws Exception {
        Mockito.doReturn(new Address()).when(myService).getAddressById(1);
        mockMvc.perform(MockMvcRequestBuilders.get("/addresses/1"))
                .andExpect(status().isOk());
    }
}

Вот исключение, которое я получаю:

org.mockito.exceptions.misusing.NullInsteadOfMockException: Аргумент передано, когда () является нулем! Пример правильной заглушки: doThrow (new RuntimeException ()). when (mock) .someMethod (); Кроме того, если вы используете аннотацию @Mock, не пропустите initMocks ()

Как будто служба никогда не создается. Как я мог решить эту проблему?

Мы можем решить эту проблему, используя @RunWith(SpringRunner.class) вместо @ExtendWith(SpringExtension.class). Может ли кто-нибудь объяснить, почему это работает? Обычно первая аннотация предназначена для junit4, а вторая - для junit5.

1 Ответ

0 голосов
/ 09 июля 2019

К сожалению, проблема была решена из-за проблемы с зависимостями.

Мой файл pom.xml содержит spring-boot-starter-test, если мы проверим, что содержит этот стартер, мы обнаружим, что он содержит junit4 в качестве зависимости, а не junit5.

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>compile</scope>
</dependency>

Поскольку я пытаюсь использовать Junit5 в моих тестовых классах с @ExtendWith (SpringExtension.class), тест, к сожалению, компилируется, но выдает ошибку времени выполнения. Я решил это, исключив junit4 из стартера начальной загрузки:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

Мой pom.xml также должен содержать зависимости junit5

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.3.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.3.2</version>
    <scope>test</scope>
</dependency>
...