我试图使用JMockit和Guice,并发现了一个非平凡的行为。我有这门课:
public class BusinessService {
PersistenceService mPS;
StockService mSS;
@Inject
public BusinessService(PersistenceService ps, StockService ss) {
mPS = ps;
mSS = ss;
}
...
}
使用Guice管理对PersistenceService和StockService的依赖。我在同一个测试类中一起尝试了这两个测试:
public class Test_BusinessService_all {
@Tested
BusinessService bs;
@Test
public void test_buy_allmock(@Injectable final StockService ss,
@Injectable final PersistenceService ps) {
Operation o = bs.buy("NVDA", 10000);
}
@Test
public void test_buy() throws StockNotFound, InvalidOperation {
Injector injector = Guice.createInjector(new USAModule());
bs = injector.getInstance(BusinessService.class);
Operation o = bs.buy("NVDA", 10000);
}
}
但第二个提出了一个例外:
java.lang.IllegalArgumentException: No constructor in class org.udg.caes.exercici3.BusinessService that can be satisfied by available injectables
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
但是,如果我将两个测试分成两个测试类,两者都可以工作!在第二个测试类(guice版本)中,我不使用@Tested,@Tested是否会以某种方式干扰Guice?我错过了什么?
由于
答案 0 :(得分:2)
是的,问题是由@Tested引起的。由于在此测试文件中声明了@Tested,因此JMockit需要找到@Injectables以满足每个测试方法的可用构造函数。这对于'test_buy'方法是不可能的。因此,如果新测试类没有@Tested'BusinessService'字段,那么将测试'test_buy'移动到另一个测试类将会起作用。
在'test_buy'中你没有使用@Tested字段,所以你可以像你已经完成的那样分开测试,或者重写测试以便他们可以遵循相同的方法。
请参阅http://jmockit.googlecode.com/svn/trunk/www/javadoc/mockit/Tested.html