标签: powermock

模拟系统类时Mockito + PowerMock LinkageError

我有这样的代码片段:

@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)

java junit4 mockito powermock linkageerror

146
推荐指数
7
解决办法
7万
查看次数

使用PowerMock模拟来自多个类的静态方法

我知道如何使用PowerMock从类中模拟静态方法.
但我想使用JUnit和PowerMock从测试类中的多个类中模拟静态方法.

任何人都可以告诉我是否可以这样做以及如何做到这一点?

java junit4 powermock

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

PowerMockito模拟单个静态方法和返回对象

我想从包含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获得的.

java easymock mockito powermock java-ee

89
推荐指数
1
解决办法
20万
查看次数

使用PowerMockito.whenNew()不会被模拟并调用原始方法

我有一个类似下面的代码:

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的新手.

java junit mockito powermock

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

用参数模拟构造函数

我有一个课程如下:

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.

java junit mocking mockito powermock

74
推荐指数
5
解决办法
20万
查看次数

如何模拟使用PowerMock返回void的静态方法?

我的项目中有一些静态的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成功,但我不喜欢变通方法.

static mocking void mockito powermock

61
推荐指数
4
解决办法
9万
查看次数

如何使用PowerMock模拟私有方法进行测试?

我有一个类,我想用一个调用私有的公共方法测试.我想假设私有方法正常工作.例如,我喜欢类似的东西doReturn....when....我发现有可能使用PowerMock的解决方案,但这个解决方案对我不起作用.怎么做?有没有人有这个问题?

java testing junit mockito powermock

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

使用PowerMock和Mockito模拟Logger和LoggerFactory

我有以下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)

我想知道:

  1. 我可以模拟静态LoggerFactory.getLogger()以适用于任何类吗?
  2. 我只能似乎运行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)

java junit slf4j mockito powermock

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

无法使用PowerMockRunner运行JUnit测试

我有一个基于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).

问候和感谢任何帮助!本

java junit exception powermock

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

PowerMock + Mockito VS Mockito一个人

任何人都可以总结一下,具体功能是什么让你在Mockito上添加PowerMock?

到目前为止,我发现了这些:

  • 模拟静态,最终和私有方法
  • 删除静态初始化程序
  • 允许在没有依赖注入的情况下进行模拟 - 这一点对我来说并不清楚.你能详细说说吗?

它是否添加了其他内容?你能用几行总结一下吗?

使用PowerMock时是否需要牺牲一些东西?

java mocking mockito powermock

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