0

我将如何测试在 SomeClass 中动态创建的这个 ValueObject 而不会使用 PowerMock 等将它存根?

class ValueOBject {
    private String x, y;
    getters
    setters
}
class SomeClass {
    public void  foo () {
       ValueObject vo = new ValueObject();
       vo.setX("some string 1");
       vo.setY("some string 2");

       faa(vo);
    }

    public void faa(ValueObject vo) {
        // do some more logic on vo here
    }
}


class SomeClassTest extends TestCase{
   public void testFoo() {
       SomeClass s = new SomeClass();
       s.foo();
       // HOW TO DO THIS?
       verify(faa(VAlueObject that is created during foo's run));
   }
}

我不想使用 PowerMockito 或类似的库来返回 MOCKED 对象!而是在方法 foo() 执行期间创建的 REAL 对象:

//    DONT WANT A MOCKED OBJECT
//    @Mock
//    private ValueOBject vo;
//     henNew(GetEmailInformation.class).withNoArguments().thenReturn(getEmailInformation);
4

4 回答 4

1

所以看起来你想要断言在中创建foo()并传递给的 ValueObject faa(vo)

创建单元测试实例化预期的 ValueObject 并将其传递给faa(vo). 然后将 this 的结果与您刚刚调用时发生的结果进行比较foo()

例如:

// in your unit test:
ValueObject testVo = new ValueObject();
// set values as needed
// testVo should represent what you expect the ValueObject instantiated by foo to 
// hold *before* it gets passed to faa

faa(testVo);
// assertions against results of faa method

foo();
// assertions *comparing* the results of foo with the results of your manual faa

因此,例如,如果我希望foo创建一个 X=1 和 Y=1 的 ValueObject,然后faa对它们施展魔法,使 ValueObject 的最终结果是 X=-1 和 Y=2,那么您的单元测试将看起来像像这样:

ValueObject testVo = new ValueObject();
testVo.setX(1);
testVo.setY(1);

faa(testVo);
// assertions using your testing library of choice to verify getX() returns -1 and
// getY() returns 2

foo();
// assertions that the end values after foo()'s faa call are -1 and 2 respectively

现在在上面的虚拟示例中,foofaa都是 void 方法,因此没有返回值。我假设它faa实际上了一些可测试的事情——例如。设置字段、更改值等。

在您对其他答案留下的一些评论中,您注意到您涉及一些私有和/或受保护的字段和方法。如果是这种情况,您将需要研究Java 反射以了解如何检索这些值。

foo()但是对于在传递给之前专门删除其中实例化的 ValueObject faa(vo),这是不可能的。正如我上面所描述的,最好的办法是测试您对期望在其中创建的 ValueObject 的行为的期望foo(),并将传递给它的结果faa(vo)与实际发生的结果进行比较。

于 2012-06-08T17:42:52.263 回答
1

ValueObject 是在内部创建的,因此它只能依赖于对象状态。你不需要测试内部,你只需要测试你所做的调用的副作用。

在这种情况下,您不需要测试 foo 因为您知道 foo 做了什么,它只是 faa 的包装器。因此,您需要测试 faa 是否存在由全局状态和 ValueObject 输入引起的操作和副作用。

如果您想测试 foo() 是否符合您的预期,您必须测试 foo() 导致的副作用是否与 faa(expectedObject) 具有相同。

换句话说:如果 foo 和 faa 是公共的,并且公共接口说 foo 是具有固定参数的 faa 的包装器,则您需要测试 foo 是否与 faa 对您期望的固定参数所做的完全一样。

于 2012-06-08T17:04:20.767 回答
0

这告诉您该设计具有紧密耦合,因此可能会将对象注入到方法中。

于 2012-06-08T16:56:29.757 回答
0

您可能需要考虑faa()使用 in进行测试foo()。从 OOP 的角度来看,我宁愿调用者foo()永远不需要知道faa()甚至存在。faa()需要公开吗?

于 2012-06-08T17:03:54.763 回答