2017-05-15 112 views
1

我有一个类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) 

任何建议,以为什么我得到这个?

+0

只是为了记录:我希望你明白,你花费** **小时,让你测试的设计......是简单地写是很难测试?如果您有这样的可能性:宁愿花时间将您的难以测试转变为易于测试的设计。并摆脱嘲笑静态调用的需要,并抛出PowerMock(ito)。会让你的整个生活变得更简单。 – GhostCat

回答

2

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

+0

当我添加这个时,eclipse会自动导入org.powermock.modules.junit4.PowerMockRunner,并在执行它时给出java.lang.TypeNotPresentException:类型PowerMockRunner不存在,引起:java.lang.ClassNotFoundExceptionPowerMockRunner \t at sun.reflect.annotation .TypeNotPresentExceptionProxy.generateException(TypeNotPresentExceptionProxy.java:46) – user3789902

+0

这似乎是一个单独的问题,与此问题的基本问题无关。我从来没有见过这个,所以我不知道是什么原因造成的。希望别人会出现谁知道如何解决这个问题。如果我大胆猜测,我会说Powermock可用于编译,但它不在运行时的类路径中,它可能与测试配置(必须)略有不同的事实有关从生产配置。 –

+0

因此,您需要了解其他类库(如junit)如何包含在您的类路径中,并确保包含powermock的方式相同。 –

1

您可以使用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)); 

    } 

}