我对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类编写了单元测试的事实,此处使用的方法确实返回了一个水果对象,并传递了该水果对象的详细信息,因此我希望它可以运行该方法而不会出现问题,但是似乎没有。完全不运行该方法。如果这确实是当前不可测试的代码,那么我想如果我用一个非静态方法替换此静态方法,那我会很好吗? 现在谢谢。