我正在使用 Mockito 来模拟一个方法,但测试正在运行真正的方法。//Controller@RestControllerpublic class Controller { private Utils utils = new Utils(); public String myMethod(String json){ // Stuff gets done return utils.writeToKafka(topic, json, kafkatemplate, classname); }我有一个看起来像这样的测试类://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 方法签名是:public String writeToKafka(String topic, String json, KafkaTemplate<String, String> kafkaTemplate, String classname)但是,当我运行测试时,并没有嘲笑 writeTokafka!它运行实际的方法。为什么会这样?我错过了什么?
1 回答
守着星空守着你
TA贡献1799条经验 获得超8个赞
您的问题的症结在于:您正在使用new一个实例,Utils并且无法从测试中清楚地得到它。
有两种方法可以解决这个问题 - 两者都来自关于是否要使用模拟的哲学立场。两者都要求您Utils在某处注入并使其成为 bean。
注入Utils并在您的测试中注入模拟,并放弃Spring 测试运行器。
一旦你有了模拟,你会想要改变你的测试,不使用 Spring runner,而是使用 Mockito runner。
@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,再编写一个用于测试的bean 并不困难)。
添加回答
举报
0/150
提交
取消