在ClassToTest.java
类中,我有以下方法:
private Optional<SomeObject> getObjById(String id) {
Optional<SomeObject> obj = someApi.getById(id);
if (!obj.isPresent()) {
throw new IllegalArgumentException("Invalid id: " + id);
}
return obj;
}
在getObjById(String id)
的公共方法callMyMethod
中调用私有方法ClassToTest
。
我想编写两种测试方案-一种,当没有提供ID且抛出错误时。这很容易,我写了它并通过了测试:
@Test(expected = IllegalArgumentException.class)
public void shouldThrowAnErrorIfIdIsNotPresented(){
Object1 obj1 = new Object1(");
testee.callMyMethod(obj1);
}
其他情况对我来说很难。我想测试一下是否存在id,它不会返回错误。模拟服务someApi
并将其注入ClassToTest
内部。它具有以下api:
@Service
public class SomeApi {
@Autowired
private ObjectManager objectManager;
@Autowired
private OtherApi otherApi;
public SomeObject get(String id) {
return objectManager.fetch(id, OtherParam...);
}
public Optional<SomeObject> getByName(String name) {
return objectManager.fetchAll(someParams)
.findFirst();
}
public Set<Obj> findByOtherParam(OtherParam param) {
.................
}
}
}
基本上,只有吸气剂。任何想法都欢迎!
答案 0 :(得分:0)
当我进行模拟测试并想要检查我的对象(这是一个有效的对象)是否持久存在于数据库中时,我使用了:verify(someApi).method(someObject); 这将检查该方法是否被实际调用。 您可以尝试这样,或者只是检查service.getById剂量是否返回null
答案 1 :(得分:0)
似乎您只需要配置模拟SomeApi
实例即可在调用该方法时返回更有用的信息。
@Test
public void testSuccessCase() {
// Can replace 'anyString' with specific String if you know it.
doReturn(Optional.of(new SomeObject())).when(mockSomeApi).getById(anyString());
testee.callMyMethod(thingThatWillGiveAboveId);
// Some verification on what happened as a result...
}