当模拟对象不返回错误时,如何测试这种情况?

时间:2018-11-30 11:34:15

标签: java spring-boot mockito

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) {
          .................
  }

  }
}

基本上,只有吸气剂。任何想法都欢迎!

2 个答案:

答案 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...
}