首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消@AfterMethod中的Whitebox.setInternalState而不设置原始状态

取消@AfterMethod中的Whitebox.setInternalState而不设置原始状态
EN

Stack Overflow用户
提问于 2018-06-11 09:09:31
回答 1查看 1.2K关注 0票数 0

我有一个类,由于接口的强制实现,我不能轻易地使用依赖项注入来模拟它--简而言之,由于这个原因,我将使用Whitebox,我在这里所关心的问题与设计无关,而是想弄清楚如何正确地"tearDown“由Whitebox引起的行为。请稍候,我会给你更多的细节-这是主要的虚拟类:

代码语言:javascript
复制
public class Dummy implements MandatoryInterface {
    private static final Logger logger = Logger.getLogger(MethodHandles.lookup().lookupClass());
    private final ObjectMapper mapper = new ObjectMapper();

    @Override
    public Object convertArgumentToJson(Object arg) {
        if (arg != null) {
            try {
                return mapper.writeValueAsString(arg);
            } catch (IOException e) {
                // doSomething();
                logger.error("Error tracking request", e);
            }
        }
        return null;
    }

}

假设我想讨论如果这里出现异常会发生什么情况,那么我看到的唯一方法就是使用Whitebox.setInternalState。在这里,测试:

代码语言:javascript
复制
public class DummyTest {
    private Dummy dummy = new Dummy();

    @Test
    public void testA() throws IOException {

        final ObjectMapper mock = Mockito.mock(ObjectMapper.class);
        Whitebox.setInternalState(dummy, "mapper", mock);


        Mockito.when(mock.writeValueAsString(Mockito.any()))
                 .thenThrow(new IOException());

        Assert.assertNull(dummy.convertArgumentToJson("testA"));

    }

    @Test
    public void testB() {
        Assert.assertNotNull(dummy.convertArgumentToJson("testB"));
    }

}

正如您所看到的,我不能将虚拟类中的映射器定义为静态的,因为Whitebox (它不能工作)。尽管如此,在执行testA()之后,我们已经对映射器进行了模拟:

问题是:在执行testB时,我不再想要模拟了--它应该是最初包含在虚拟环境中的旧实例ObjectMapper。但出现的情况是:

现在,我的问题:

撤销的正确方法是什么

代码语言:javascript
复制
 Whitebox.setInternalState(dummy, "mapper", mock);

P.S.:我考虑过使用像这样的tearDown():

代码语言:javascript
复制
@AfterMethod
public void tearDown(){
    Whitebox.setInternalState(dummy, "mapper", originalState);
}

然而,在这个场景中,我最可怜的(突变测试)会认为我没有涉及ObjectMapper的初始化,那么:是否有一种方法可以在不手动设置旧测试的情况下为其余的测试撤消Whitebox?

很抱歉给您详细的描述,并提前感谢您。

致以敬意,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-11 09:33:50

抱歉,伙计们,我成功了。

万一其他人面临同样的问题,答案比我想象的要容易。

代码语言:javascript
复制
private static final String MAPPER_DESC = "mapper";
private ObjectMapper originalMapper;

@BeforeMethod
public void init() {
    MockitoAnnotations.initMocks(this);
     originalMapper = (ObjectMapper) Whitebox.getInternalState(converter, MAPPER_DESC);
}

@AfterMethod
public void tearDown() {
    Whitebox.setInternalState(converter, MAPPER_DESC, originalMapper);
}

然后testA和testB可以保留相同的代码。而突变测试仍将包含ObjectMapper属性声明,如图像所示:

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

https://stackoverflow.com/questions/50794077

复制
相关文章

相似问题

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