gpt4 book ai didi

java - 使用 powermock 在 Java 中抑制单例构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:15:08 25 4
gpt4 key购买 nike

我正在尝试对一些使用 Singleton 类的类进行单元测试,这些类的构造函数执行一些我不能(也不应该)在单元测试环境中执行的操作。我理想的场景是完全抑制构造函数,然后清除我的测试类调用的其他成员方法。我的问题是我似乎无法抑制构造函数。

我对解决此问题的方法的理解如下:

public class MySingleton extends AbstractSingletonParent {
public final static MySingleton Only = new MySingleton();
private MySingleton(){
super(someVar); // I want the super-class constructor to not be called
//
//more code I want to avoid
}

public Object stubbedMethod() {}
}

public class ClassToBeTested {
public void SomeMethod(){
Object o = MySingleton.Only.stubbedMethod();
}
}


@RunWith(PowerMockRunner.class)
@PrepareForTest(MySingleton.class)
public class TestClass {
@Test
public void SomeTest() {
suppress(constructor(MySingleton.class));
mockStatic(MySingleton.class);

PowerMock.replay(MySingleton.class);
// invoke ClassToBeTested, etc

PowerMock.verify(MySingleton.class);

//make some assertions
}
}

不幸的是,在 createMock 调用期间,MySingleton 构造函数被命中,它仍然调用 super 构造函数。

我是在做傻事吗?我在网上找到了一个几乎完全这样做的示例,但它使用的是已弃用的 suppressConstructor 方法。尽管遭到弃用,我也尝试过,但无济于事......

我想做的事情可行吗?如果是这样,我做错了什么?

*编辑后的版本现在可用。

最佳答案

您需要使用 @PrepareForTest 注释对 TestClass 进行注释,以便它有机会操作单例的字节码。

此外,父类(super class)构造函数抑制签名应该包括somevar的类;现在你只是在抑制默认的 ctor。

参见 @PrepareForTest API docs.这是一个 blog post还有一些更多的细节。

FWIW,它对我有用:


@RunWith(PowerMockRunner.class)
@PrepareForTest({EvilBase.class, NicerSingleton.class})
public class TestEvil {

@Test
public void testEvil() {
suppress(constructor(EvilBase.class));
assertEquals(69, EvilBase.getInstance().theMethod());
}

@Test
public void testNice() {
suppress(constructor(EvilBase.class));
suppress(constructor(NicerSingleton.class));
assertEquals(42, NicerSingleton.getInstance().theMethod());
}

}

关于java - 使用 powermock 在 Java 中抑制单例构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8100816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com