我正在使用Mockito模拟方法,但是测试正在运行实际方法。
close_inactive
我有一个看起来像这样的测试类:
//Controller
@RestController
public class Controller {
private Utils utils = new Utils();
public String myMethod(String json){
// Stuff gets done
return utils.writeToKafka(topic, json, kafkatemplate, classname);
}
我的writeToKafka方法签名是:
//Test
@RunWith(SpringJUnit4ClassRunner.class)
public class ControllerTest {
@Captor
ArgumentCaptor<String> argumentCaptor;
@Test
public void processOSPUpdateRequested_test(){
Controller controller = new Controller();
Utils utils = Mockito.spy(new Utils());
Mockito.doReturn("myResult").when(utils).writeToKafka(anyString(), anyString(), any(), anyString());
String topic = controller.myMethod(myString);
//Some assertions
但是,当我运行测试时,不会嘲笑writeTokafka!它运行实际的方法。为什么会这样呢?我想念什么?
答案 0 :(得分:1)
问题的症结所在:您new
正在Utils
的一个实例中,您无法从测试中完全得到它。
有两种方法可以解决此问题-都来自于关于是否要使用模拟的哲学立场。这两个 do 都要求您注入Utils
并使其成为某个位置的bean。
注入Utils
,然后在测试中注入模拟,并放弃 Spring测试运行器。
一旦安装好模拟程序,就想将测试更改为不使用Spring运行器,而是使用Mockito运行器。
@RunWith(MockitoJUnitRunner.class)
public class ControllerTest {
@Mock
private Utils utils;
@InjectMocks
private Controller testObj;
// The rest of your test code
}
将Utils
作为已定义的测试作用域bean注入到测试中,该bean表现出您想要在测试中表现的行为。
这有点麻烦,但是您可以利用Spring测试运行器。我将其留给读者作为练习(基本上,一旦您编写了Utils
bean,编写另一个用于测试就不难了。)