2017-05-15 29 views
1

私は、ある例外をスローする抽象クラスBの静的メソッドを呼び出すクラスAを持っています。私はこの例外をテストしたかったのです。私は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"); 
    } 
} 

が、私はここにこれらの例外をテストしたいとすると、このテストケースを実行している間、私は例外のよう

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) 

任意の提案を取得し、私のテストクラス

@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(); 
    } 
    } 
} 

ですなぜ私はこれを取得していますか?

+0

念のために:私は、あなたがデザインのテストを可能にするために** **時間を費やしていることを理解してほしい...それは単にテストするのは難しいように書かれていますか?もしあなたがそうする可能性があるなら、むしろその時間を費やして難しいテストを簡単なテストデザインに変えることができます。静的な呼び出しをモックする必要性を取り除き、PowerMock(ito)をスローします。あなたの人生はずっと簡単になります。 – GhostCat

答えて

2

あなたはこの必要があります:あなたは、静的メソッドを模擬するためにpowermockを使用することができます@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

を。

コード例

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

    } 

} 
関連する問題