代码之家  ›  专栏  ›  技术社区  ›  hammerfest

类必须在内部创建新对象,不能从单元测试访问该对象

  •  0
  • hammerfest  · 技术社区  · 7 年前

    我们有一个类,其目的是更改接收对象的某些字段中的值,并保留其其他字段的值

    public void process(SomeType someObject) {
      SomeType modifiedObject = modifyObject(someObject);
      nextClass.process(modifiedObject);
    }
    
    private SomeType modifyObject(SomeType someObject) {
      String someValueFromServiceCall = someService.getSomeValue(...);
      SomeType modifiedObject = new SomeType.Builder()
                                            .withSomeFieldValuesFromSomeObjectItself(...)
                                            .withSomeFieldValuesFromServiceCall(someValueFromServiceCall)
                                            .build();
      return modifiedObject;
    }
    

    SomeType 是一个遗留类,我们只能使用它的生成器类创建它,它没有setter方法。这意味着我们不能修改接收到的 someObject 但必须建立并返回一个新的 基类型 对象来自 modifyObject() ,然后主方法可以将其传递给下一个类进行处理

    modifiedObject 从单元测试类中,我们似乎无法对它进行期望/断言

    SomeType someObject = createSomeObjectForTest();
    expect(someServiceMock.getSomeValue(...)).andReturn(SOME_VALUE);
    expect(nextClassMock.process(someObject)).andReturn(...); //this is not someObject, but the new internal modifiedObject created within underTest
    underTest.process(someObject);
    assertEquals(someObject.getSomeField(), SOME_VALUE); //this is not someObject, but the new internal modifiedObject created within underTest
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   daniu    7 年前

    下面是如何使用 ArgumentCaptor :

    // mock and make sure all fields required for modify are set
    SomeType arg = create(); 
    ArgumentCaptor<SomeType> captor = ArgumentCaptor. forClass(SomeType.class);
    
    sut.process(arg) ;
    
    verify (nextClass). process(captor.capture());
    SomeType modified = captor.get();