我有这样的代码片段:
@RunWith(PowerMockRunner.class)
@PrepareForTest({Thread.class})
public class AllMeasuresDataTest {
@Before
public void setUp() throws Exception {
}
@Test
public void testGetMeasures() {
AllMeasuresData measure = new AllMeasuresData();
assertEquals(measure.getMeasures(), null);
HashMap<String, Measure> map = new HashMap<String, Measure>();
measure.setMeasures(map);
assertEquals(measure.getMeasures(), map);
measure.setMeasures(null);
assertEquals(measure.getMeasures(), null);
}
@Test
public void testAllMeasuresData() throws IOException {
ClassLoader loader = PowerMockito.mock(ClassLoader.class);
Thread threadMock = PowerMockito.mock(Thread.class);
Vector<URL> vec = new Vector<URL>();
Mockito.when(loader.getResources("measure")).thenReturn(vec.elements());
Mockito.when(threadMock.getContextClassLoader()).thenReturn(loader);
PowerMockito.mockStatic(Thread.class);
Mockito.when(Thread.currentThread()).thenReturn(threadMock);
...
}
}
Run Code Online (Sandbox Code Playgroud)
在运行此测试时,我得到了:
java.lang.LinkageError: loader constraint violation: loader (instance of org/powermock/core/classloader/MockClassLoader) previously initiated loading …
Run Code Online (Sandbox Code Playgroud) 我知道如何使用PowerMock从类中模拟静态方法.
但我想使用JUnit和PowerMock从测试类中的多个类中模拟静态方法.
任何人都可以告诉我是否可以这样做以及如何做到这一点?
我想从包含2个静态方法m1和m2的类中模拟静态方法m1.我希望方法m1返回一个对象.
我尝试了以下内容
1)
PowerMockito.mockStatic(Static.class, new Answer<Long>() {
@Override
public Long answer(InvocationOnMock invocation) throws Throwable {
return 1000l;
}
});
Run Code Online (Sandbox Code Playgroud)
这是调用m1和m2,它们具有不同的返回类型,因此它给出了返回类型不匹配错误.
2)PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l);
但是当执行m1时不会调用它.
3)PowerMockito.mockPartial(Static.class, "m1");
给出了mockPartial不可用的编译错误,这是我从http://code.google.com/p/powermock/wiki/MockitoUsage获得的.
我有一个类似下面的代码:
Class A {
public boolean myMethod(someargs) {
MyQueryClass query = new MyQueryClass();
Long id = query.getNextId();
// some more code
}
}
Class MyQueryClass {
....
public Long getNextId() {
//lot of DB code, execute some DB query
return id;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我正在写一个测试A.myMethod(someargs)
.我想跳过真正的方法query.getNextId()
,而是返回一个存根值.基本上,我想嘲笑MyQueryClass
.
所以在我的测试用例中,我使用过:
MyQueryClass query = PowerMockito.mock(MyQueryClass.class);
PowerMockito.whenNew(MyQueryClass.class).withNoArguments().thenReturn(query);
when(query.getNextId()).thenReturn(1000000L);
boolean b = A.getInstance().myMethod(args);
//asserts
Run Code Online (Sandbox Code Playgroud)
我曾经@RunWith(PowerMockRunner.class)
和@PrepareForTest({MyQueryClass.class})
我的测试类的开始.
但是,当我调试测试,它仍然是调用真正的方法getNextId()
中的MyQueryClass
类.
我在这里错过了什么?任何人都可以提供帮助,因为我是Mockito和PowerMockito的新手.
我有一个课程如下:
public class A {
public A(String test) {
bla bla bla
}
public String check() {
bla bla bla
}
}
Run Code Online (Sandbox Code Playgroud)
在构造函数中的逻辑A(String test)
和check()
是我试图嘲弄的事情.我想要任何调用:new A($$$any string$$$).check()
返回一个虚拟字符串"test"
.
我试过了:
A a = mock(A.class);
when(a.check()).thenReturn("test");
String test = a.check(); // to this point, everything works. test shows as "tests"
whenNew(A.class).withArguments(Matchers.anyString()).thenReturn(rk);
// also tried:
//whenNew(A.class).withParameterTypes(String.class).withArguments(Matchers.anyString()).thenReturn(rk);
new A("random string").check(); // this doesn't work
Run Code Online (Sandbox Code Playgroud)
但它似乎没有奏效.new A($$$any string$$$).check()
仍然通过构造函数逻辑而不是获取模拟对象A
.
我的项目中有一些静态的util方法,其中一些只是传递或抛出异常.关于如何模拟具有除void之外的返回类型的静态方法,有很多例子.但是我如何模拟一个将void返回到" doNothing()
" 的静态方法?
非void版本使用以下代码行:
@PrepareForTest(StaticResource.class)
Run Code Online (Sandbox Code Playgroud)
...
PowerMockito.mockStatic(StaticResource.class);
Run Code Online (Sandbox Code Playgroud)
...
Mockito.when(StaticResource.getResource("string")).thenReturn("string");
Run Code Online (Sandbox Code Playgroud)
但是,如果应用于StaticResources
返回void
,编译将抱怨when(T)
不适用于void ...
有任何想法吗?
一个解决方法可能是让所有静态方法返回一些Boolean
成功,但我不喜欢变通方法.
我有一个类,我想用一个调用私有的公共方法测试.我想假设私有方法正常工作.例如,我喜欢类似的东西doReturn....when...
.我发现有可能使用PowerMock的解决方案,但这个解决方案对我不起作用.怎么做?有没有人有这个问题?
我有以下Logger我想模拟,但验证日志条目被调用,而不是内容.
private static Logger logger =
LoggerFactory.getLogger(GoodbyeController.class);
Run Code Online (Sandbox Code Playgroud)
我想模拟用于LoggerFactory.getLogger()的任何类,但我无法找到如何做到这一点.这是我到目前为止所得到的:
@Before
public void performBeforeEachTest() {
PowerMockito.mockStatic(LoggerFactory.class);
when(LoggerFactory.getLogger(GoodbyeController.class)).
thenReturn(loggerMock);
when(loggerMock.isDebugEnabled()).thenReturn(true);
doNothing().when(loggerMock).error(any(String.class));
...
}
Run Code Online (Sandbox Code Playgroud)
我想知道:
LoggerFactory.getLogger()
以适用于任何类吗?when(loggerMock.isDebugEnabled()).thenReturn(true);
的@Before
,因此我似乎无法改变每个方法的特点.有没有解决的办法?编辑发现:
我以为我已经尝试了这个并且它没有用:
when(LoggerFactory.getLogger(any(Class.class))).thenReturn(loggerMock);
Run Code Online (Sandbox Code Playgroud)
但是,谢谢你,因为它确实有效.
但是我尝试了无数的变化:
when(loggerMock.isDebugEnabled()).thenReturn(true);
Run Code Online (Sandbox Code Playgroud)
我不能让loggerMock改变它的行为,@Before
但这只发生在Coburtura上.使用Clover,覆盖率显示为100%,但仍然存在问题.
我有这个简单的课程:
public ExampleService{
private static final Logger logger =
LoggerFactory.getLogger(ExampleService.class);
public String getMessage() {
if(logger.isDebugEnabled()){
logger.debug("isDebugEnabled");
logger.debug("isDebugEnabled");
}
return "Hello world!";
}
...
}
Run Code Online (Sandbox Code Playgroud)
然后我有这个测试:
@RunWith(PowerMockRunner.class)
@PrepareForTest({LoggerFactory.class})
public class ExampleServiceTests {
@Mock
private Logger loggerMock;
private ExampleServiceservice = new ExampleService();
@Before
public …
Run Code Online (Sandbox Code Playgroud) 我有一个基于Gradle的Java项目,我现在想要使用PowerMock模拟一个私有方法.问题是我无法使用PowerMockRunner,因为我在添加@RunWith(org.powermock.modules.junit4.PowerMockRunner.class)
注释时总是遇到以下异常.
错误:
org.powermock.reflect.exceptions.FieldNotFoundException: Field 'fTestClass' was not found in class org.junit.internal.runners.MethodValidator.
at org.powermock.reflect.internal.WhiteboxImpl.getInternalState(WhiteboxImpl.java:581)
at org.powermock.reflect.Whitebox.getInternalState(Whitebox.java:308)
at org.powermock.modules.junit4.internal.impl.testcaseworkaround.PowerMockJUnit4MethodValidator.validate TestMethods(PowerMockJUnit4MethodValidator.java:79)
at org.powermock.modules.junit4.internal.impl.testcaseworkaround.PowerMockJUnit4MethodValidator.validate InstanceMethods(PowerMockJUnit4MethodValidator.java:49)
at org.junit.internal.runners.MethodValidator.validateMethodsForDefaultRunner(MethodValidator.java:51)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.validate(PowerMockJUnit44RunnerDelegateImpl.java:108)
...
Run Code Online (Sandbox Code Playgroud)
这是我的测试依赖项:
testCompile 'junit:junit:4.+',
'org.powermock:powermock-core:1.5.6',
'org.powermock:powermock-module-junit4:1.5.6',
'org.powermock:powermock-api-mockito:1.5.6'
Run Code Online (Sandbox Code Playgroud)
完全为空时(初始化错误),测试本身也会失败:
@RunWith(PowerMockRunner.class)
public class SomeTest {
@Test
public void testSomething() {
}
}
Run Code Online (Sandbox Code Playgroud)
什么想法可能是错的?使用PowerMock的其他测试工作正常(它们都没有使用PowerMockRunner).
问候和感谢任何帮助!本
任何人都可以总结一下,具体功能是什么让你在Mockito上添加PowerMock?
到目前为止,我发现了这些:
它是否添加了其他内容?你能用几行总结一下吗?
使用PowerMock时是否需要牺牲一些东西?