JMockit:如何将MockUp类注入到被测试的类中?

3

我是JMockIt的新手,正在努力理解如何在已定义的顶级MockUp类中使用@Injectable

例如:

// JUnit Test Class
public class RepositoryTest {

    @Tested private Repository repository;
    @Injectable private ResultsAPIWrapper resultsApiWrapper;

    @Test
    public void testRepo(){
        new ResultsApiWrapper();
        assertThat(repository.doSomething(), is("done" ) );
    }
}


// Class under test
public class Repository{

   @Autowired private ResultsAPIWrapper resultsApiWrapper;

   public String doSomething(){
      return resultsApiWrapper.load();
   }
}

// Mocked implementation of the ResultsAPIWrapper that I want injected into Repository
public class ResultsApiWrapperMock extends MockUp<ResultsAPIWrapper>{
   @Mock
   public String load(){
      return "done";
   }
}

如果我尝试上述方法,会出现错误。
java.lang.IllegalArgumentException: Class already mocked: com.fw.wrappers.ResultsAPIWrapper
    at com.fw.wrappers.mock.ResultsApiWrapperMock.<init>(ResultsApiWrapperMock.java:12)
    at com.fw.repository.RepositoryTest.testRepo(RepositoryTest.java:38)

但是,如果我删除new ResultsApiWrapper(),我就不知道如何指定哪个类作为我的模拟实现来进行自动装配。

我是否误解了如何做到这一点?我该如何指定我要使用MockUp<>实现来进行JMockit的自动装配?

1个回答

0

我也是新手,但我认为像这样的东西在你的情况下会起作用... 这将模拟ResultsAPIWrapper(),不会初始化任何静态变量,并为load()创建一个特定的模拟:

new MockUp<ResultsAPIWrapper>() {
  @Mock
  void $clinit() {
    //disable static initialization
  }

  @Mock
  public String load() {
     return "done";
  }
};

我没有尝试的一件事,但它仍然不起作用。 JMockit 仍然抱怨 ResultsAPIWrapper 已经被模拟了(由于 @Injectable 字段)。 - Eric B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接