Mockito 2.19.0-在测试中的类方法中使用了静态方法时返回了Null,无法在Mockito中进行测试吗?

时间:2018-07-22 13:58:42

标签: java spring gradle mockito assertj

我对Mockito还是陌生的,他们已经通过了官方文档和一些在线教程来编写测试,因此当我从静态方法返回null时,可能会缺少某些东西在被测服务类的方法内部调用。我将Mockito 2.19.0与assertJ 3.10.0一起使用,正在测试的方法是这样的:

public Fruit saveFruit(Fruit fruit) {
    final String name = fruit.getName().toLowerCase();
    Optional<Fruit> fruitOptional = fruitRepository.findOneByName(name);
    if (!fruitOptional.isPresent()) {
        Fruit newFruit = userDeviceRepository.save(Builder.buildFruitNew(fruit));
        LOG.info("saveFruit\t\t->\Fruit saved, {}", newFruit);
        return newFruit;
    } else {
        LOG.info("saveFruit\t\t->\tFruit already exists, updating existing fruit");
        Fruit updatedFruit = fruitOptional.map(Builder::buildFruitGet).get();
        updatedFruit.setFruitType(fruit.getFruitType());
        return fruitRepository.save(updatedFruit);
    }
}

我一直尝试编写的测试方法:

@ExtendWith(MockitoExtension.class)
class UserDeviceServiceTest {

   @Mock
   private FruitRepository fruitRepository;

   @InjectMocks
   private FruitServiceImpl fruitServiceImpl;

   @Test
   public void whenSavingNewFruitItShouldReturnTheSavedFruit() {
       Fruit newFruit = new Fruit("Lemon", "Yellow");

       // Given that a new fruit is saved and returns the new fruit
       given(fruitRepository.save(newFruit)).willReturn(newFruit);

       // When saving a new fruit
       assertThat(fruitServiceImpl.saveFruit(newFruit))

       // Then it should return the new fruit
       .isSameAs(newFruit);
    }
}

运行测试时,出现以下失败消息:

java.lang.AssertionError: 
Expecting:
 <com.fruits.domain.models.Fruit@3bf20acd>
and actual:
 <null>
to refer to the same object

编辑:添加了我在Builder类中调用的方法:

public static Fruit buildFruitNew(Fruit fruit) {
    return new Fruit(fruit.getId(), fruit.getType());
}

在我看来,问题出在我调用Builder类的行中,该类包含静态方法,这些方法返回一个新的实例化水果对象,该对象已查看了标准输出以查看记录器行,然后确定记录了空值宾语。我在这里已经读过一遍,有人提到可能需要PowerMock和JMockit来测试诸如此类,所以我认为目前由于内部使用了静态方法,因此可能无法测试该方法?我知道已经为Builder类编写了单元测试的事实,此处使用的方法确实返回了一个水果对象,并传递了该水果对象的详细信息,因此我希望它可以运行该方法而不会出现问题,但是似乎没有。完全不运行该方法。如果这确实是当前不可测试的代码,那么我想如果我用一个非静态方法替换此静态方法,那我会很好吗? 现在谢谢。

0 个答案:

没有答案