JMockit + Guice:@Tested和Guice可以在同一个测试类中混合使用吗?

时间:2013-11-15 17:41:27

标签: junit guice jmockit

我试图使用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?我错过了什么?

由于

1 个答案:

答案 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