简体   繁体   English

使用 Mockito 模拟接口时出现空指针异常

[英]Null pointer exception when using Mockito to mock interface

I'm using Mockito to test the following method:我正在使用 Mockito 来测试以下方法:

  protected void produceProducedFieldValue(Target target) throws ValueProducerCreationException {
    String mappedValue = (String) valueProducerFactory.createValueProducer("IdProducer", Collections.emptyList()).get();
    target.setProducedField(mappedValue);
  }

Here is my test:这是我的测试:

     @Test
    public void TestProducingProducedFieldValue() throws ValueProducerCreationException {

        Target mockedTarget = Mockito.mock(Target.class);
        ValueProducerFactory valueProducerFactory = Mockito.mock(ValueProducerFactory.class);
        List<Object> creationParameters = new ArrayList<>();

        String mappedValue= "SomeString";

        Mockito.when(valueProducerFactory.createValueProducer("IdProducer", Collections.emptyList()).get()).thenReturn(mappedValue);
        SourceToTargetMapper sttm = new SourceToTargetMapper(targetModelObjectFactory,mappingOperatorFactory,mapperFactory,valueProducerFactory);
        sttm.produceProducedFieldValue(mockedTarget);
        Mockito.verify(mockedTarget, Mockito.times(1)).setProducedField(Mockito.any());
    }

But I keep getting NullPointerExeption for this line:但我不断收到此行的NullPointerExeption

    Mockito.when(valueProducerFactory.createValueProducer("IdProducer", Collections.emptyList()).get()).thenReturn(mappedValue);

ValueProducerFactory is an Interface ValueProducerFactory是一个接口

and the createValueProducer method signature is as follows:createValueProducer方法签名如下:

    public interface ValueProducerFactory {

        <T> Supplier<T> createValueProducer(String producerName, List<Object> creationParameters) throws ValueProducerCreationException;

    }

I have a class named CachingValueProducerFactory that implements the interface我有一个名为 CachingValueProducerFactory 的类,它实现了接口

    @Override
    public <T> Supplier<T> createValueProducer(String producerName, List<Object> creationParameters) throws ValueProducerCreationException {
        Map<List<Object>, Supplier<?>> parametersToOperatorsMap = producersCache.computeIfAbsent(producerName, s -> new HashMap<>());

        List<Object> key = Optional.ofNullable(creationParameters).orElse(Collections.emptyList());

        if (!parametersToOperatorsMap.containsKey(key)) {
            parametersToOperatorsMap.put(key, nestedProducersFactory.createValueProducer(producerName, creationParameters));
        }

        return (Supplier<T>) parametersToOperatorsMap.get(key);
    }

It seems like using Collections.emptyList() in the test is the problem, but I don't see any other solution for this.在测试中使用Collections.emptyList()似乎是问题所在,但我没有看到任何其他解决方案。

You are trying to mock two methods at once.您正在尝试同时模拟两种方法。 In this line:在这一行:

Mockito.when(valueProducerFactory.createValueProducer("IdProducer", Collections.emptyList()).get()).thenReturn(mappedValue);

you are calling get() on the result of the createValueProducer() call, which is null because you haven't mocked it yet.您正在对createValueProducer()调用的结果调用get() ,该结果为null因为您尚未对其进行createValueProducer()

There are two solutions:有两种解决方案:

Use deep stubbing :使用深存根

ValueProducerFactory valueProducerFactory = Mockito.mock(ValueProducerFactory.class, Mockito.RETURNS_DEEP_STUBS);
Mockito.when(valueProducerFactory.createValueProducer("IdProducer", Collections.emptyList()).get()).thenReturn(mappedValue);

Mock the Supplier first (pay attention to the removed get() ):首先模拟供应商(注意移除的get() ):

Supplier<Object> supplier = () -> mappedValue;
ValueProducerFactory valueProducerFactory = Mockito.mock(ValueProducerFactory.class);
Mockito.when(valueProducerFactory.createValueProducer("IdProducer", Collections.emptyList())).thenReturn(supplier);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM