我有一个像下面这样的方法,
public void generateCSVFile(final Date billingDate) {
asyncTaskExecutor.execute(new Runnable() {
public void run() {
try {
accessService.generateCSVFile(billingDate);
} catch (Exception e) {
LOG.error(e.getMessage());
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
我嘲笑:
PowerMockito.doNothing().when(accessService).generateCSVFile(billingDate);
Run Code Online (Sandbox Code Playgroud)
但是当我验证时:
verify(rbmPublicViewAccessService, timeout(100).times(1)).generateCSVFile(billingDate);
Run Code Online (Sandbox Code Playgroud)
它给了我没有被调用.这是因为它是通过单独的线程调用的,是否可以验证在不同线程中调用的方法?
pom.xml
为了让PowerMock与Mockito合作,我需要添加哪些罐子?我有以下依赖项:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-support</artifactId>
<version>1.4.11</version>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
但是当我@PrepareForTest
在类级别添加注释时,Eclipse无法找到它,但它可以找到PowerMockito
.我错过了什么罐子?
如果没有在您正在测试的类中创建/初始化模拟对象,它是如何在运行时获取模拟对象的,它不是静态的(单例模式),或者您没有某种类型的测试构造函数可以挂钩?
在我正在编写单元测试的类中,我遇到了一个我尚未遇到/解决过的场景.我有一个JMS资源(QueueConnectionFactory
供参考,但它没关系),这是我正在测试的类的私有变量.由于它具有javax.annotation.Resource
注释,因此在运行时假定它是可用的.在测试期间,它不是,这就需要模拟这个对象.
它不是一个静态类,并没有以静态方式使用,如果它是我可以轻松地使用我遇到的各种静态模拟方法进行模拟.由于资源永远不会在本地创建(在构造函数中或甚至在测试构造函数中),因此我无法传入Mock对象,因此在测试的运行时,将使用mock而不是实际的对象.如何模拟此资源,以便在测试执行时,它将用于代替@Resource
我正在测试的类中的私有对象?
作为参考,代码调用createConnection()
在QueueConnectionFactory
其中抛出一个空指针异常,因为该工厂尚未初始化/嘲笑.
@Stateless
public class Example{
@Resource(name = "jms/exampleQCF")
private QueueConnectionFactory queueFactory;
...
public void testMe(){
Connection connection = queueFactory.createConnection();
...
}
}
Run Code Online (Sandbox Code Playgroud) 我在尝试使用PowerMock和Mockito执行单元测试时遇到了问题.我需要PowerMockito来模拟静态方法.
这些是我使用的版本:
PowerMock 1.6.2
Mockito 1.10.19
JUnit 4.12
Java 8
Run Code Online (Sandbox Code Playgroud)
当我添加注释@PrepareForTest(Graph.class)时,我收到以下错误:
java.lang.IllegalStateException: Failed to transform class with name name.of.my.package.GraphUtil. Reason: javassist.bytecode.InterfaceMethodrefInfo cannot be cast to javassist.bytecode.MethodrefInfo
Run Code Online (Sandbox Code Playgroud)
我在官方的PowerMock Google页面中读到这与javassist有关.但我有点失落,我不知道如何解决它.
为了以防万一,我也尝试下载最新的Powermock SNAPSHOT(1.6.3-SNAPSHOT),但也没有用.
有人可以帮帮我吗?
提前致谢
我正在使用PowerMock,我想知道如何保持子类的所有行为,但是存根super
调用可能被子进程覆盖.
说我有这个班:
public class A {
public String someMethod() {
return "I don't want to see this value";
}
}
Run Code Online (Sandbox Code Playgroud)
和一个子类:
public class B extends A {
@Override
public String someMethod() {
return super.someMethod() + ", but I want to see this one";
}
}
Run Code Online (Sandbox Code Playgroud)
如何将呼叫存根到super.someMethod()
?
我试过了
@Test
public void test() {
B spy = PowerMockito.spy(new B());
PowerMockito.doReturn("value").when((A)spy).someMethod();
assertEquals("value, but I want to see this one", spi.someMethod());
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用PowerMockRunner编写单元测试但是我收到以下错误:
java.lang.IllegalStateException:扩展API内部错误:org.powermock.api.extension.reporter.MockingFrameworkReporterFactoryImpl无法位于类路径中.在org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.getFrameworkReporterFactory(AbstractTestSuiteChunkerImpl.java:190)在org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.getMockingFrameworkReporter(JUnit4TestSuiteChunkerImpl.java:140)在org.powermock org.powermock上的org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)中的.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:119) .modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)位于org.eclipse.jdt.internal.junit.runner的org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) .TestExecution.run(TestExecution.java:38)org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:675)org.eclipse.jdt.internal.junit.ru nner.RemoteTestRunner.run(RemoteTestRunner.java:382)at or.e.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
我检查了所有依赖项,没关系,我还需要其他东西吗?
我正在尝试使用模拟构造函数,PowerMockito
但每次运行测试时都会出现以下错误:
java.lang.NoSuchMethodError: org.mockito.internal.creation.MockSettingsImpl.setMockName(Lorg/mockito/mock/MockName;)Lorg/mockito/internal/creation/settings/CreationSettings;
at org.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl(MockCreator.java:107)
at org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:60)
at org.powermock.api.mockito.internal.expectation.DefaultConstructorExpectationSetup.createNewSubstituteMock(DefaultConstructorExpectationSetup.java:105)
at org.powermock.api.mockito.internal.expectation.DefaultConstructorExpectationSetup.withAnyArguments(DefaultConstructorExpectationSetup.java:71)
Run Code Online (Sandbox Code Playgroud)
我的项目中有以下PowerMock依赖项:
我已经跟踪了我的项目的依赖树并修复了冲突,以便mockito-all:1.9.5
包含在构建中.
我想模拟一个继承的受保护方法.我无法直接从java代码调用此方法,因为它从另一个包中的类继承.我找不到一种方法来指定这个方法来存入when(...)
package a;
public class A() {
protected int m() {}
}
package b;
public class B extends a.A {
// this class currently does not override m method from a.A
public asd() {}
}
// test
package b;
class BTest {
@Test
public void testClass() {
B instance = PowerMockito.spy(new B());
PowerMockito.when(instance, <specify a method m>).thenReturn(123);
//PowerMockito.when(instance.m()).thenReturn(123); -- obviously does not work
}
}
Run Code Online (Sandbox Code Playgroud)
我查看了PowerMockito.when
覆盖,这似乎只是私人方法!
如何指定受保护的方法?
在我使用Mockito的单元测试中,我想验证NullPointerException
没有被抛出.
public void testNPENotThrown{
Calling calling= Mock(Calling.class);
testClass.setInner(calling);
testClass.setThrow(true);
testClass.testMethod();
verify(calling, never()).method();
}
Run Code Online (Sandbox Code Playgroud)
我的测试设置了testClass
,设置Calling
对象和属性,以便该方法将抛出一个NullPointerException
.
我验证从不调用Calling.method().
public void testMethod(){
if(throw) {
throw new NullPointerException();
}
calling.method();
}
Run Code Online (Sandbox Code Playgroud)
我想要一个失败的测试,因为它抛出一个NullPointerException
,然后我想写一些代码来解决这个问题.
我注意到的是测试总是通过,因为异常永远不会被测试方法抛出.
我正在尝试使用PowerMockito来模拟Android Robolectric测试中的一些静态方法.我按照这里的指示使用JUnit 4.8.2,Robolectric 2.2,Mockito 1.9.5和PowerMock 1.9.5 .因为我必须使用RoboElectricTestRunner,所以我试图使用PowerMockRule来引导PowerMock.但是,java.lang.IncompatibleClassChangeError
当PowerMock的测试运行时,我很不幸.
Sun.reflect.DeativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)的java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:323)at sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain(InstrumentationImpl.java:348)引发者:java.lang.IncompatibleClassChangeError:
在java.lang.ClassLoader.defineClass(ClassLoader.java)java.lang.ClassLoader.defineClassCond(ClassLoader.java:637)的java.lang.ClassLoader.defineClass1(Native Method)中实现类:621)at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
如果我把图书馆放到org.ow2.asm
后面,org.powermock
我得到:
java.lang.IncompatibleClassChangeError:class org.objectweb.asm.tree.ClassNode在java.lang.ClassLoader.defineClassCond(ClassLoader)的java.lang.ClassLoader.defineClass1(Native Method)中将接口org.objectweb.asm.ClassVisitor作为超类.java:637)java.lang.ClassLoader.defineClass(ClassLoader.java:621),位于java.net.URLClassLoader.defineClass(URLClassLoader.java:283)java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.access $ 000(URLClassLoader.java:58)at java.net.URLClassLoader $ 1.run(URLClassLoader.java:197)at java.security.AccessController.doPrivileged(Native Method)
在每个单元测试.
根据Maven依赖性:树Robolectric和PowerMock不共享任何依赖.但显然org.powermock:powermock-module-javaagent打包了一些org/objectweb/asm类,而Robolectric依赖于org.ow2.asm:asm:jar:4.1导致冲突.
@RunWith(RobolectricTestRunner.class)
@PrepareForTest(Helper.class)
@PowerMockIgnore({"com.sun.jmx.*", "javax.management.*"})
public class HelpFragTest {
@Rule
public PowerMockRule rule = new PowerMockRule();
static {
PowerMockAgent.initializeIfNeeded();
}
FragmentActivity fragmentActivity;
FragmentManager fragmentManager; …
Run Code Online (Sandbox Code Playgroud) java ×10
powermock ×10
mockito ×6
mocking ×3
powermockito ×2
android ×1
eclipse ×1
javassist ×1
junit ×1
junit4 ×1
maven ×1
overriding ×1
robolectric ×1
stub ×1
super ×1