埋め込みTomcatインスタンスによって呼び出される静的メソッドをモックしようとしています。ここに私のテストクラスは次のとおりです。この構成で埋め込みTomcatでPowerMockを使用する
@RunWith(PowerMockRunner.class)
@PrepareForTest(ExternalAPI.class)
@PowerMockIgnore({"javax.management.*"})
public class TestExternalAPI
{
@Before
public void setup() {
Tomcat tomcat = new Tomcat();
tomcat.setPort(8080);
tomcat.enableNaming();
tomcat.addWebapp("/app", new File("src/test/webapp").getAbsolutePath());
tomcat.start();
}
@Test
public void testAPI() {
mockStatic(ExternalAPI.class);
when(ExternalAPI.getData()).thenReturn(new Data());
//call Tomcat triggering the call to ExternalAPI.getData()
}
}
私は次の例外を取得:。
java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet
at org.apache.tomcat.util.IntrospectionUtils.callMethod1(IntrospectionUtils.java:849)
at org.apache.tomcat.util.digester.SetNextRule.end(SetNextRule.java:201)
at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:1060)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1783)
...
は今、私はパッケージ*多分私はorg.apacheを無視するPowerMockを伝える必要があると思ったが、 *作品のパッケージを、私はまた、すべての組織を無視して試してみました
java.lang.ClassCastException: com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl cannot be cast to javax.xml.parsers.SAXParserFactory
at javax.xml.parsers.FactoryFinder.newInstance(FactoryFinder.java:190)
... 54 more
が、その後ExternalAPI.getData()メソッドは、すべての嘲笑されていません:私はこの例外を取得します。このケースでは、Tomcatインスタンスからの何も嘲笑されていないからです。なぜなら、これらのorg.apache。*パッケージを無視しているからです。
なぜこれらの例外が発生し、どのようにPowerMockを構成する必要がありますか?
編集:私はTomcat 7を使用しています。PowerMockが使用されていない場合は、埋め込まれたTomcatインスタンスを使用してテストが正常に実行されます。
ここで実際に達成しようとしていることがわかりません。通常、単体テストでは、コードが依存している依存関係を模倣し、コードを呼び出し、モックを適切に使用するようにします。 * Tomcat *を書いていない限り、Tomcatを嘲笑するのではなく、なぜTomcatを埋め込んでいるのか分かりません。一番下に記述するシナリオは、*統合テスト*の完全な例です。これらのテストも同様に行う必要があります。しかし、私はここで単体テストシナリオを取得しません。 – dcsohl
@dcsohlこのWebアプリケーションのフロー全体をテストしたいと思います。しかし、私は、そのフロー中にトリガされた外部呼び出しを模擬したいので、テストを実行するときに外部システムは必要ありません。私は埋め込まれたTomcatのインスタンスにアプリケーションを展開し、それにREST呼び出しを送信することによってこれをしようとしています。これは、このアプローチを使用するいくつかのテストをすでに持っているレガシーアプリケーションの一部です。したがって、完全にリファクタリングすることは実際の選択肢ではありません。 –