Тест с высмеиваемым сервисом и еще одним тестом с реальной реализациейJAVA

Программисты JAVA общаются здесь
Anonymous
Тест с высмеиваемым сервисом и еще одним тестом с реальной реализацией

Сообщение Anonymous »

tl; dr: Я хочу проверить метод контроллера, который использует сервис и саму сервис, который называется, как в их соответствующих классах тестирования модулей, но не может сделать это, поскольку издевавшийся в фасоли заменяет оригинальный бобовый.public class SomeController {
@PostMapping("/load")
public ResponseEntity someMethod(@RequestParam("val") String val) {
String lifeStatus = someService.serviceMethod(val);
return ResponseEntity.status(HttpStatus.OK).body(lifeStatus);
}
}
< /code>
Допустим, служба такова: < /p>
public class SomeServiceImpl implements SomeService {
public String serviceMethod(String val){
//business logic here
if (resultOfSuchBusinessLogic){
return "Life is good";
}
return "Life is not so good";
}
}
< /code>
Тогда я хотел создать тест для этого метода контроллера. Итак, я сделал тестовую конфигурацию: < /p>
@Configuration
@ActiveProfiles("test") //So I can load application-test.properties
public class TestConfig {
@Autowired private SomeServiceMock someService;

@Bean
@Primary
SomeService someService() {
return someService;
}

}
< /code>
и MockService: < /p>
public class SomeServiceMock implements SomeService {
public String serviceMethod(String val){
if (val == "good"){
return "Life is good";
}
return "Life is not so good";
}
}
< /code>
и в моем тестовом классе для контроллера я сделал это: < /p>
@ContextConfiguration(classes = TestConfig.class)
@SpringBootTest
@ActiveProfiles("test")
public class SomeControllerTests {
@Autowired private SomeController controller;

public void someTestOk() {
ResponseEntity someVar = controller.someMethod("someValue");

assertFalse(someVar.getBody(), "Life is good");
}
}
< /code>
На данный момент это сработало, и я не заботился о внутреннем поведении класса SomeServiceImpl.
Но тогда я заботился. Потому что, когда я делаю это: < /p>
@SpringBootTest
@ActiveProfiles("test")
public class SomeServiceTests {
@Autowired private SomeService someService;

public void someTestOk() {
ResponseEntity someVar = someService.someMethod("someValue");

assertTrue(someVar.getBody(), "Life is good");
}
}
< /code>
все еще использует высмеивающий, несмотря на то, что у него нет контекста. Я обнаружил, что контекст такой же, и когда он создаст боб, он заменит оригинал. Я также пытался использовать класс конфигурации с макетом: < /p>
@Bean
@Primary //(with and without this)
public SomeService someService() {
return mock(SomeService.class);
}

@BeforeAll method
when(someService.someMethod(anyString()).then(blah bla)
< /code>
Но все еще не работает. Либо оба используют исходный боб, либо оба используют высмеиваемые. Какие -нибудь указатели на то, что мне не хватает?

Подробнее здесь: https://stackoverflow.com/questions/796 ... ementation

Вернуться в «JAVA»