【问题标题】:Mockito: Mock object which is no member but is created inlineMockito:模拟对象,它不是成员,而是内联创建的
【发布时间】:2020-05-26 09:59:33
【问题描述】:

我有一个类,它执行以下操作:

public class Transformer {

    public void transform(final Car car) throws IOException {
        switch (car.getType()) {
            case OFFROAD:
                OffroadCar offroadCar = new OffroadTransformer().transform(car);

                // do something with offorad car

                break;
            ...
        }
    }
}

我有一个测试班:

public class TransformerTest {

    @InjectMocks
    private Transformer transformer;

    @Mock
    private OffroadTransformer offroadTransformer;

    @BeforeEach
    public void setup()
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testTransform() throws IOException {
        final Car car = new Car(OFFROAD);

        when(offroadTransformer.transform(any(Car.class))).thenReturn(new OffroadCar());

        transformer.transform(car);

        // make some verifictations
    }
}

我现在的问题是when 不起作用。真正的offroadTransformer.transform 被调用而不是模拟。所以我的假设是模拟不起作用,因为OffroadTransformer 不是Transformer 类的成员,并且实例是内联创建的。

对吗?

如果是:我怎么能模拟它? 如果不是:还有什么原因?

【问题讨论】:

    标签: java unit-testing mockito


    【解决方案1】:

    问题是正在使用的OffroadTransformer 对象没有被模拟。您的测试设置正在 transformer 字段中创建一个模拟,但该模拟不是该方法使用的模拟,这证实了您的假设。

    您使用的设置适用于将模拟对象作为实例字段的类,如下所示:

    public class Transformer {
    
        //injected, initialized inline, etc.
        private OffroadTransformer transformer;
    
        public void transform(final Car car) throws IOException {
            switch (car.getType()) {
                case OFFROAD:
                    OffroadCar offroadCar = this.transformer.transform(car);
    
                    // do something with offorad car
    
                    break;
                ...
            }
        }
    }
    

    Mockito 会将模拟注入到这样的类中,方法执行将使用 Mockito 创建的模拟。

    如果您不想使用此设置,那么您可能需要查看mocking the constructor 之类的OffroadTransformer

    不过,附带说明一下,工厂类(例如 OffroadTransformer)没有状态并用作单例是相当普遍的做法。因此,按照上面提到的设置并让 Mockito 为您处理注射会更自然。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 2023-02-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多