【问题标题】:Mocking a static method in abstract class在抽象类中模拟静态方法
【发布时间】:2017-05-15 06:56:27
【问题描述】:

我有一个类 A 调用抽象类 B 的静态方法,该方法抛出一些异常。我想测试这个异常。我正在使用 junit 4.1、mockito 1.9.5 和 powermock 1.6.6。课程是:

 abstract class B {
 public static void meth(String str) throws SomeException1, SomeException2,SomeException3 {
 //some code 
  }
}

class A{
 public void method() throws SomeException1, SomeException2,SomeException3 {
  B.meth1("abc");
  }
}

我想测试这些异常,这是我的测试类

@RunWith(MockitoJUnitRunner.class)
@PrepareForTest(B.class)
class Test throws Throwable {

public void testException(){
PowerMockito.mockStatic(B.class); //Line 6
when(B.meth(Mockito.any(String.class))).thenThrow(new SomeException1(), new SomeException2(), new SomeException3() );
A obj=new A();
obj.method();
   }
  }
}

在执行这个测试用例时我得到一个异常

org.powermock.api.mockito.ClassNotPreparedException: 
The class B not prepared for test.
To prepare this class, add class to the '@PrepareForTest' annotation.
In case if you don't use this annotation, add the annotation on class or  method level. 

at org.powermock.api.mockito.expectation.reporter.MockitoPowerMockReporter.classNotPrepared(MockitoPowerMockReporter.java:32)
at org.powermock.api.mockito.internal.mockcreation.MockTypeValidatorFactory$DefaultMockTypeValidator.validate(MockTypeValidatorFactory.java:38)
at org.powermock.api.mockito.internal.mockcreation.AbstractMockCreator.validateType(AbstractMockCreator.java:10)
at org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.createMock(DefaultMockCreator.java:56)
at org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.mock(DefaultMockCreator.java:46)
at org.powermock.api.mockito.PowerMockito.mockStatic(PowerMockito.java:71)
at Test.testException(Test.java:6)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

关于我为什么会得到这个的任何建议?

【问题讨论】:

  • 仅作记录:我希望您了解您花费 小时 来测试设计......只是为了难以测试而编写?如果您有可能这样做:宁愿花时间将难以测试的设计转变为易于测试的设计。并摆脱了模拟静态调用的需要,并抛弃了 PowerMock(ito)。会让你的整个生活变得更简单。

标签: java junit mockito powermock


【解决方案1】:

你需要这个:@RunWith(PowerMockRunner.class)

【讨论】:

  • 当我添加这个时,eclipse 会自动导入 org.powermock.modules.junit4.PowerMockRunner 并在执行时给出 java.lang.TypeNotPresentException: Type PowerMockRunner not present , Caused by: java.lang.ClassNotFoundExceptionPowerMockRunner at sun.reflect.annotation.TypeNotPresentExceptionProxy.generateException(TypeNotPresentExceptionProxy.java:46)
  • 这似乎是一个单独的问题,与该问题所涉及的基本问题无关。我以前从未见过这种情况,所以我不知道是什么原因造成的。希望其他知道如何解决此问题的人会出现。如果我大胆猜测,我会说 powermock 可用于编译,但它在运行时不在您的类路径中,这可能与测试配置(必须)略有不同的事实有关来自生产配置。
  • 因此,您需要查看其他库(如 junit)如何包含在您的类路径中,并确保 powermock 以相同的方式包含。
  • 代码中存在一些差异,将其重置到我的 git 分支的头部解决了这个异常。但是现在我的测试用例通过了,但如果说 when(B.meth(Mockito.any(String.class))).thenThrow(new SomeException1(), new SomeException2(), FileNotFoundException ); ,它通过了测试用例但没有抛出任何异常?有什么想法吗?
  • 如果您有新问题,请提出新问题。在这里接受其中一个答案;继续前进。避免通过 cmets 玩“我还有一件事”。
【解决方案2】:

您可以使用 powermock 来模拟静态方法。

代码示例

@RunWith(PowerMockRunner.class)
public class TestStaticMethodExample {
    private SomeClass c = new SomeClass ("g", "123");

    @PrepareForTest({ SomeStatic.class })
    @Test
    public void stubStaticMethod() {

        PowerMockito.mockStatic(SomeStatic.class);

        PowerMockito.when(SomeStatic.getSummary()).thenReturn(new 
    SomeClass("t", 9999));

    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2011-07-09
    相关资源
    最近更新 更多