首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让JMockit向JMockit @Tested类注入特定的实例?

如何让JMockit向JMockit @Tested类注入特定的实例?
EN

Stack Overflow用户
提问于 2020-06-02 01:06:33
回答 1查看 423关注 0票数 1

我有一个正在尝试用JMockit 1.49测试的类。我的被测类使用带有两个参数的构造函数注入;一个是模拟的,另一个是我想在测试类中实例化的,并让JMockit为我注入。不幸的是,我似乎不能让它工作。

代码语言:javascript
复制
public class DocFilterService {

    // get a static slf4j logger for the class
    protected static final Logger logger = getLogger(DocFilterService.class);

    private DocRepository DocRepository;
    private ObjectMapper objectMapper;

    @Inject
    public DocFilterService(DocRepository DocRepository, @Doc ObjectMapper objectMapper) {
        this.DocRepository = DocRepository;
        this.objectMapper = objectMapper;
    }

    // business method to test
    public DocWrapperDTO filterDoc(Context context, DocWrapperDTO dcfData){
      // some business logic looking to test.
      ... 
    }
}

在我的JMockit测试类中,我有以下内容:

代码语言:javascript
复制
public class DocFilterServiceTest2 {

    @Mocked @Injectable DocRepository DocRepository;
    @Doc ObjectMapper objectMapper = new DocProducer().getMapper();
    @Tested DocFilterService sut;

    @BeforeClass
    public static void jMockit(){
        Startup.verifyInitialization();
    }

    @Test
    public void testInvalidResponse() throws IOException {
        // create some valid input
        Context context = Context.ContextBuilder.aContext()
                .user(User.UserBuilder.aUser()
                        .id("123")
                        .build()
                )
                .build();

        ObjectMapper mapper = new ObjectMapper();
        new Expectations(){{
            DocRepository.filterDoc( (Body<DocWrapperDTO>) any ); result = mapper.readTree("{\"decision_id\": \"1\"}"); minTimes=1;
        }};


        // todo to fix.  Use a Mock repo and proper parameter
        sut.filterDoc( context, new DocWrapperDTO());

        new Verifications(){{
            DocRepository.filterDoc((Body<DocWrapperDTO>)any);
        }};

    }
}

使用此配置时,JMockit会抛出以下错误:

代码语言:javascript
复制
java.lang.IllegalArgumentException: No constructor in tested class that can be satisfied by available tested/injectable values
  public org.wada.adams.opa.dcf.DcfFilterService(org.wada.adams.opa.dcf.repository.DcfRepository, com.fasterxml.jackson.databind.ObjectMapper)
    disregarded because no tested/injectable value was found for parameter "objectMapper"

如果我将@Tested注释更改为

代码语言:javascript
复制
        @Tested(fullyInitialized=true) DocFilterService sut;

那么注入到我的sut中的ObjectMapper是ObjectMapper的一个新实例,而不是声明为@Doc ObjectMapper objectMapper = new DocProducer().getMapper();实例的那个实例。

我试过阅读JMockit上的文档,我的印象是它应该使用在我的测试类中声明的任何实例,但它似乎没有做到这一点。

我如何向JMockit指定/声明我希望它使用我的实例作为注入候选者,而不是实例化一个新的实例?是否需要将其声明为@Tested实例?它看起来不像是正确的注释。

EN

回答 1

Stack Overflow用户

发布于 2020-07-03 11:25:54

对于@Tested元素,JMockit将调用一个具有@Injectable参数的构造。在您的示例中,需要将DocRepository和ObjectMapper都设置为@Injectable。默认情况下,@Injectables也是@Mocked的,所以你不需要两个注解。我相信这会行得通

代码语言:javascript
复制
@Injectable DocRepository DocRepository;
@Injectable ObjectMapper objectMapper;
@Tested DocFilterService sut;

这就是说,上面的内容让objectMapper成为了一个笑柄。您的原始代码似乎正在尝试使用它的真实实例。从纯理论上讲,这是一个坏主意,因为ObjectMapper是一个不同的“单元”,所以在DocFilterService“单元”中,我们应该把它当作一个黑盒来模拟它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62137275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档