2015-01-26 91 views
0

我想在運行時在grails(2.4.4)項目中編譯和運行JUnit(4.12)測試。在運行時編譯JUnit測試:「沒有可運行的方法」

以下字符串是此類測試的示例(classname:「DasS」)。

import org.junit.runner.JUnitCore; 
import static org.junit.Assert.*; 
import org.junit.Before;import org.junit.Test; 
import org.junit.After; 

public class DasS { 

    public DasS(){} 

    @Before 
    public void setUp() {} 

    @After 
    public void tearDown(){} 

    @Test 
    public void test0() { 
    assertEquals(new Integer(1),new Integer(1)); 
    } 

    @Test 
    public void test1() { 
    assertEquals(new Double(1),new Double(1)); 
    } 
} 

以下方法的目的是加載類並運行編譯的測試。

public void run() { 

    URLClassLoader loader = (URLClassLoader) getClass().getClassLoader(); 
    DynamicClassLoader dynamicLoader = new DynamicClassLoader(loader); 


    try { 
     dynamicLoader.addURL(new File(Configure.TMP_FOLDER).toURI().toURL()); 
    } catch (MalformedURLException e1) { 
     //Add good exception handling here 
    } 

    try { 
     dynamicLoader.loadClass("DasS"); 
    } catch (ClassNotFoundException e2) { 
     // TODO Auto-generated catch block 
     e2.printStackTrace(); 
    } 
    Class testClass2 = null; 
    try { 
     testClass2 = Class.forName("DasS", true, dynamicLoader); 
    } catch (ClassNotFoundException e2) { 
     // TODO Auto-generated catch block 
     e2.printStackTrace(); 
    } 
    Result result2 = JUnitCore.runClasses(testClass2); 
    for(Failure f : result2.getFailures()) { 
     System.out.println(f.getMessage()); 
    } 

} 

有編譯過程中,也沒有類的加載過程中沒有錯誤,但我每次運行此代碼,我得到「沒有可運行的方法」作爲一個失敗的消息,雖然也有一些明顯的測試方法的時間。

堆棧跟蹤通過f.getTrace():

java.lang.Exception: No runnable methods 
at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:191) 
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:128) 
at org.junit.runners.ParentRunner.validate(ParentRunner.java:416) 
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:84) 
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65) 
at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:10) 
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26) 
at org.junit.runner.Computer.getRunner(Computer.java:40) 
at org.junit.runner.Computer$1.runnerForClass(Computer.java:31) 
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 
at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:101) 
at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:87) 
at org.junit.runners.Suite.<init>(Suite.java:81) 
at org.junit.runner.Computer.getSuite(Computer.java:28) 
at org.junit.runner.Request.classes(Request.java:75) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:105) 
at org.junit.runner.JUnitCore.runClasses(JUnitCore.java:62) 
at org.junit.runner.JUnitCore.runClasses(JUnitCore.java:49) 
at codeEvaluation.RuntimeAnalysis$$EP2Zc8Kk.run(RuntimeAnalysis.java:117) 
at codeEvaluation.RuntimeAnalysis$$DP2Zc8Kk.run(Unknown Source) 
at codeEvaluation.RuntimeAnalysis.run(RuntimeAnalysis.java) 
at codeEvaluation.CodeEvaluation.runtimeEval(CodeEvaluation.java:258) 
at codeEvaluation.CodeEvaluation.eval(CodeEvaluation.java:97) 
at codeEvaluation.CodeEvaluation$eval.call(Unknown Source) 
at tastypi.ExerciseController.run(ExerciseController.groovy:70) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:483) 
at org.springsource.loaded.ri.OriginalClassInvoker.invoke(OriginalClassInvoker.java:47) 
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1299) 
at org.codehaus.groovy.grails.web.servlet.mvc.MixedGrailsControllerHelper.invoke(MixedGrailsControllerHelper.java:154) 
at org.codehaus.groovy.grails.web.servlet.mvc.AbstractGrailsControllerHelper.handleAction(AbstractGrailsControllerHelper.java:375) 
at org.codehaus.groovy.grails.web.servlet.mvc.AbstractGrailsControllerHelper.executeAction(AbstractGrailsControllerHelper.java:252) 
at org.codehaus.groovy.grails.web.servlet.mvc.AbstractGrailsControllerHelper.handleURI(AbstractGrailsControllerHelper.java:205) 
at org.codehaus.groovy.grails.web.servlet.mvc.AbstractGrailsControllerHelper.handleURI(AbstractGrailsControllerHelper.java:126) 
at org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsController.handleRequest(SimpleGrailsController.java:72) 
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:50) 
at org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet.doDispatch(GrailsDispatcherServlet.java:347) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) 
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:198) 
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63) 
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) 
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) 
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:486) 
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:411) 
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:338) 
at org.codehaus.groovy.grails.web.mapping.UrlMappingUtils.forwardRequestForUrlMappingInfo(UrlMappingUtils.java:178) 
at org.codehaus.groovy.grails.web.mapping.UrlMappingUtils.forwardRequestForUrlMappingInfo(UrlMappingUtils.java:144) 
at org.codehaus.groovy.grails.web.mapping.UrlMappingUtils.forwardRequestForUrlMappingInfo(UrlMappingUtils.java:135) 
at org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.doFilterInternal(UrlMappingsFilter.java:216) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:69) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.codehaus.groovy.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) 
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Thread.java:745) 
+0

你能粘貼錯誤堆棧跟蹤? – Grzesuav 2015-01-27 07:48:24

+0

對不起,我忘了。我編輯它。 – tastyPI 2015-01-27 13:17:06

回答

0

如果我只是複製粘貼您的測試類(DASS)到Android Studio中的新類(路徑必須是正確的),那麼2周的測試運行爲我成功。 在UI上選擇的測試運行是:

android.support.test.runner.AndroidJUnitRunner 

我不需要你的輔助方法(公共無效的run())

在你的項目的依賴可能會有所不同。您可能需要我的一個子集:

dependencies { 
    compile 'com.android.support:support-annotations:22.2.0' 
    androidTestCompile 'com.google.dexmaker:dexmaker:1.2' 
    androidTestCompile 'com.android.support.test:runner:0.4.1' 
    androidTestCompile 'com.android.support.test:rules:0.3' 
    androidTestCompile 'junit:junit:4.12' 
} 

但是你可能需要設置正確的測試運行(仍在的build.gradle):

defaultConfig { 
    minSdkVersion 19 
    targetSdkVersion 22 
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
}