java - 方法不被 mock

标签 java unit-testing testing mocking mockito

我正在使用 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。

  1. 注入(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
    }
    
  2. Utils 作为定义的测试范围 bean 注入(inject)到您的测试中,该 bean 展示您希望在测试中的行为。

    这有点繁琐,但您可以利用 Spring 测试运行程序。我将此作为读者的练习(基本上,一旦您编写了 Utils bean,编写另一个用于测试的 bean 并不困难)。

关于java - 方法不被 mock ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52370181/

相关文章:

java - 减少 JUnit 输出

testing - FITSharp 'Include' 页面返回通过或失败

java - 在 webdriver 中使用 log.error 捕获没有此类元素?

java - 如果最后一个条件失败,如何重新启动 do-while 循环?

C# 单元测试 - 包含多个测试的 XML 数据源

Android Marshmallow 权限测试

c# - 测试 UWP 蓝牙应用程序

java - 如何从可执行 jar 读取本地属性文件?

java - JNA 使用 LPCWSTR 参数调用 C++ 函数

python - Python unittest 中的测试如何访问详细级别?