我不认为我应该理解测试。我写了很多测试,并得到了不错的报道,但我不禁觉得这不是直观的。
让我解释一下:如果我有一个类,我正在测试一个方法,它需要传递一个某种类型的大对象,以及各种状态。这个对象又包含了我不知道的其他对象和它们的状态,我该如何为这个方法创建模拟或存根对象,并为它提供它可以使用的数据。似乎我必须创建一个包含各种内部子对象信息的大对象来执行我的方法。我显然搞糊涂了!
发布于 2011-09-19 10:48:58
这里的其他答案是指向mocking框架,如果您还没有使用它(使用Mockito!),那么您绝对应该看看它。然而,这几乎可以肯定是你的测试告诉你你有设计问题的一个例子。如果您发现自己必须提供各种不相关的信息和模拟对象才能通过测试,那么您就是
这些都是系统不是为可测试性而设计的症状,这几乎普遍等同于系统不是为可读性而设计的,这意味着它的设计不是很好。
如果你关心良好的测试,那就接受测试优先思想和测试驱动开发。我强烈推荐两本关于这个主题的书:我已经读过的"xUnit Test Patterns"和reviewed,以及我即将读完的"Growing Object-Oriented Software, Guided by Tests"。
发布于 2011-09-19 05:40:04
你想要的是一个模拟框架。他们有很多人。看看Mockito或EasyMock吧。
简而言之,您将使用如下所示的代码:
when(mockedList.get(0)).thenReturn("first");
when(mockedList.get(1)).thenThrow(new RuntimeException());它允许您指定调用特定方法时的行为,而无需模拟整个对象。如果你有一个非常复杂的对象,你是在模仿,它会有点复杂,但你基本上只是指定了你期望看到的行为。
发布于 2011-09-19 07:07:38
处理有很多状态和依赖对象的对象的一种方法是在EasyMock中使用“漂亮的模拟”(我认为这是Mockito中的默认设置)。这将始终为模拟对象上的任何方法返回“空”值(null、0或空字符串)。
如果依赖对象需要做一些事情,那么你需要从你的对象返回实际的或模拟的对象。
例如,在EasyMock中,它将如下所示:
Mock mock = createNiceMock(MyClass.class);
// override default 'empty' returns for values you care about
// this could return a mock instead
ChildObj c = new ChildObj("state");
expect(mock.getChildObj()).andReturn(c);
// replay, call methods on object under test, verify here但是,您可能希望从更大的角度出发:为什么要使用mock?一些人喜欢只使用真实的对象和存根进行测试,而另一些人则更喜欢模拟。在谷歌上搜索“mocks vs.stubs”并阅读排名前3或4的结果将帮助你决定mock是否适合你。
https://stackoverflow.com/questions/7464599
复制相似问题