我正在使用 Mockito 来模拟一个方法,但测试正在运行真实的方法。
//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);
}
我有一个看起来像这样的测试类:
//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 并没有被模拟!它运行实际的方法。为什么会这样?我错过了什么?
最佳答案
问题的症结所在:您是 新
Utils
的一个实例,您无法从测试中清楚地了解它。
有两种方法可以解决此问题 - 两种方法都来自关于是否要使用模拟的哲学立场。两者都确实需要您注入(inject) Utils
并使其成为某处的 bean。
注入(inject)
Utils
并在您的测试中注入(inject)模拟,然后放弃 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 注入(inject)到您的测试中,该 bean 展示您希望在测试中的行为。这有点繁琐,但您可以利用 Spring 测试运行程序。我将此作为读者的练习(基本上,一旦您编写了
Utils
bean,编写另一个用于测试的 bean 并不困难)。
关于java - 方法不被 mock ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52370181/