我正在使用mockito编写集成测试。被测单元通过接口连接到模拟对象(objA)。当被模仿的对象触发一个事件,而被测试的单元正在监听它时,我试图模仿的功能就会发生。
接口:
public interface MyInterfaceAPI{
void fireyMyEvent(String msg);
}被测单元:
public class UnitUnderTest{
ObjA objA;
public UnitUnderTest(ObjA objA_t) {
objA = objA_t;
objA.addMyListener(new addMyHandler());
}
class addMyHandler implements MyInterfaceAPI{
@Override
public void fireyMyEvent(String msg) {
System.out.println(msg);
};
};
};测试:
public class MyTest {
@org.junit.Test
public void run() {
ObjA mockObjA = mock(ObjA .class);
UnitUnderTest spyController = Mockito.spy(new UnitUnderTest());
MyInterfaceAPI mo2uut= mock(MyInterfaceAPI.class);
mo2uut.fireyMyEvent("hello from test");
}
}我的问题是在测试中,如何将mo2uut (‘模拟对象’到‘被测单元’)连接到UnitUnderTest中MyInterfaceAPI的addMyHandler类实现?
我显然遗漏了一些东西,但我不确定是什么。
发布于 2016-02-01 23:34:58
你有两个关于单元测试的学校:伦敦/ Mockist学校和底特律学校。
如果你想使用mock,你必须使用依赖注入,所以你可以用mock替换依赖。我认为大多数关注底特律学派的人也会同意这一点,因为使用依赖注入“是一件好事”(tm)。
您可以做的是在构造函数中将ObjA的实例传递给UnitUnderTest;或者(如果ObjA是一个集合)添加UnitUnderTest.addListener()方法,在该方法中传递处理程序的实例。使用这两种方法,您将注入一个处理程序。
关于使用powermock: Powermock是一种更好的工具,用于单元测试很少且依赖关系混乱的旧项目。如果你现在正在编码,使用power mock是错误的(本着公平的精神,这是一个有偏见的想法,但它与许多其他人分享)。
编辑
现在我明白你的问题了!我认为你试图在一个单元测试中测试太多,这就导致了问题。再一次,嘲笑学派谈到了测试交互。这就是关键点。因此,在UnitUnderTest的测试中,惟一的交互是与ObjA设置处理程序,这就是故事的结尾。
您可能需要对ObjA进行另一个测试,以确保所有处理程序都被调用。
现在,最后一部分是如何测试处理程序的代码。但在此之前,请理解每个测试的独立性,因为您正在测试交互(以及代码中的任何逻辑),但不要超过一件事情。关于训练员..。您可能不喜欢这样,但您必须使该类可访问,要么将其设置为公共类,要么将其提取到另一个公共类。如果您将其解压缩,则可以将其放入一个internal包中,这样就可以清楚地看出这个类不应该被其他任何人使用。
如果您有一个小时的空闲时间,我建议您观看这个优秀的演示文稿:The Deep Synergy Between Testability and Good Design by Michael Feathers,他在其中介绍了一个类似的示例,说明了您的代码中有哪些内容,以及为什么将其分离是有意义的。
发布于 2016-02-01 22:51:01
使用PowerMock的PowerMockito拦截对addMyHandler类的调用,注入一个模拟的MyInterfaceAPI,如Ben Kiefer关于"PowerMockito: Constructor Mocking"的教程中所述
发布于 2016-02-02 01:19:12
我已经设法让它工作了。在这里发布修复代码,供将来看到此内容的人使用。
public interface MyInterfaceAPI{
void fireyMyEvent(String msg);
}被测单元:
public class UnitUnderTest{
private ObjA objA;
public MyInterfaceAPI interfaceHandler;
public UnitUnderTest(ObjA objA_t) {
objA = objA_t;
interfaceHandler = new addMyHandler();
objA.addMyListener(interfaceHandler);
}
class addMyHandler implements MyInterfaceAPI{
@Override
public void fireyMyEvent(String msg) {
System.out.println(msg);
};
};
};测试:
public class MyTest {
@org.junit.Test
public void run() {
ObjA mockObjA = mock(ObjA .class);
UnitUnderTest spyController = Mockito.spy(new UnitUnderTest());
spyController.hnd.fireyMyEvent("hello from test");
}
}https://stackoverflow.com/questions/35133263
复制相似问题