标签: powermock

是否可以验证在Mockito中以不同线程运行的模拟方法?

我有一个像下面这样的方法,

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)

它给了我没有被调用.这是因为它是通过单独的线程调用的,是否可以验证在不同线程中调用的方法?

java mocking mockito powermock

19
推荐指数
2
解决办法
2万
查看次数

我应该使用哪些Maven工件导入PowerMock?

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.我错过了什么罐子?

java mockito powermock maven

19
推荐指数
1
解决办法
5万
查看次数

嘲笑假定存在的私有变量

如果没有在您正在测试的类中创建/初始化模拟对象,它是如何在运行时获取模拟对象的,它不是静态的(单例模式),或者您没有某种类型的测试构造函数可以挂钩?

在我正在编写单元测试的类中,我遇到了一个我尚未遇到/解决过的场景.我有一个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)

java mocking mockito powermock

19
推荐指数
1
解决办法
3万
查看次数

PowerMock和Java 8问题:InterfaceMethodrefInfo无法强制转换为MethodrefInfo

我在尝试使用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),但也没有用.

有人可以帮帮我吗?

提前致谢

java powermock javassist

18
推荐指数
3
解决办法
1万
查看次数

PowerMock:来自父类的存根方法

我正在使用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)

java overriding stub super powermock

18
推荐指数
2
解决办法
1万
查看次数

扩展API内部错误:org.powermock.api.extension.reporter.MockingFrameworkReporterFactoryImpl

我正在尝试使用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)

我检查了所有依赖项,没关系,我还需要其他东西吗?

java eclipse junit powermock powermockito

18
推荐指数
3
解决办法
1万
查看次数

PowerMock抛出NoSuchMethodError(setMockName)

我正在尝试使用模拟构造函数,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依赖项:

  • org.powermock:powermock模块-junit4:1.5.6
  • org.powermock:powermock-的Mockito释放全:1.5.6

我已经跟踪了我的项目的依赖树并修复了冲突,以便mockito-all:1.9.5包含在构建中.

java junit4 mockito powermock

17
推荐指数
3
解决办法
3万
查看次数

嘲弄保护方法

我想模拟一个继承的受保护方法.我无法直接从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覆盖,这似乎只是私人方法!

如何指定受保护的方法?

java mockito powermock powermockito

16
推荐指数
1
解决办法
4万
查看次数

如何验证未抛出异常

在我使用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,然后我想写一些代码来解决这个问题.

我注意到的是测试总是通过,因为异常永远不会被测试方法抛出.

java mocking mockito powermock

16
推荐指数
2
解决办法
3万
查看次数

使用PowerMock和Robolectric - IncompatibleClassChangeError

我正在尝试使用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 android powermock robolectric

16
推荐指数
1
解决办法
5820
查看次数