我写了一个工厂来生产java.sql.Connection物品:
public class MySQLDatabaseConnectionFactory implements DatabaseConnectionFactory {
@Override public Connection getConnection() {
try {
return DriverManager.getConnection(...);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想验证传递给的参数DriverManager.getConnection,但我不知道如何模拟静态方法.我正在使用JUnit 4和Mockito来测试我的测试用例.有没有一种很好的方法来模拟/验证这个特定的用例?
我找不到有关如何使用Android Studio/Gradle设置powermock的任何信息.我尝试过的所有内容都会导致构建异常.
任何人都可以展示出正确的方法吗?
谢谢.
我想在模型类中记录信息 - 不一定用于单元测试目的,而是用于我尝试调试的现实生活场景。
但是,如果我尝试使用android.util.Log方法,在运行 JUnit 测试时会出现以下错误:
java.lang.RuntimeException: Method d in android.util.Log not mocked. See http://g.co/androidstudio/not-mocked for details.
Run Code Online (Sandbox Code Playgroud)
我明白为什么会发生这种情况,我不应该在设计为独立于框架的模型类中使用 Android 框架代码!我并不是真的反对这个错误,而是我试图找到一种方法来解决这个问题。
我有一个想法,这有意义吗?
CustomLog沿着这些线创建一个类:
public class CustomLog {
private static ILogger mLogger;
public static void setLogger(ILogger logger) {
mLogger = logger;
}
public static void e(String tag, String message) {
mLogger.e(tag, message);
}
}
Run Code Online (Sandbox Code Playgroud)
ILogger具有执行日志功能所需方法的接口在哪里(e、d 等方法...)
我可以创建一个ILoggerImpl使用这些android.util.Log方法的MockLogger类,以及一个简单地打印出来System.out.println和/或什么都不做(或其他任何事情!)的类。
我认为这完全符合我的需求(我需要CustomLog在生命周期的早期设置我的类,但这不是什么大问题)。
但是,如果我需要将第三方库/外部代码添加到我的模型类中,如果新库/代码使用android.util.Log方法,这可能会以相同的方式再次中断。
那么,是否有我可以使用的“一网打尽”类型的行为?你怎么认为?
我得到一个java.lang.NoClassDefFoundError: android/util/Log错误,当我尝试运行在Eclipse中我的单元测试项目.
蒸馏下来,我的测试代码如下所示:
package com.randomtype.yycparking;
import junit.framework.TestCase;
import android.util.Log;
public class StallTests extends TestCase {
public void setUp() {
Log.v("HI", "Fail");
}
public void testShouldParseIdFromTitle() {
assertTrue(true);
}
}
Run Code Online (Sandbox Code Playgroud)
并且代码在Log.v调用时抛出异常.当我正常运行android项目时,我没有任何例外Log.
完整堆栈跟踪:
java.lang.NoClassDefFoundError: android/util/Log
at com.randomtype.yycparking.StallTests.setUp(StallTests.java:11)
at junit.framework.TestCase.runBare(TestCase.java:132)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:243)
at junit.framework.TestSuite.run(TestSuite.java:238)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.ClassNotFoundException: android.util.Log
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) …Run Code Online (Sandbox Code Playgroud) 以下是我想测试的代码.
public class Demo {
private static final List<Pair<String, String>> mList;
static {
mList = new ArrayList<>();
mList.add(new Pair<>("F0", "T1"));
mList.add(new Pair<>("F1", "T2"));
mList.add(new Pair<>("F2", "T3"));
}
public String getStr(int pos) {
return mList.get(pos).first;
}
}
Run Code Online (Sandbox Code Playgroud)
我是一个Android开发人员.我在测试和模拟代码时遇到了一些麻烦.我使用了mockito.我已经尝试了一些代码来测试它,但结果并不是我的期望.
1.第一次尝试
@Test
public void test(){
Demo demo=new Demo();
assertEquals(demo.getStr(0),"F0");
/**
* java.lang.AssertionError:
* Expected :null
* Actual :F0
*/
}
Run Code Online (Sandbox Code Playgroud)
2.第二次尝试
@Test
public void test() {
Demo demo = mock(Demo.class);
doCallRealMethod().when(demo).getStr(0);
assertEquals(demo.getStr(0), "F0");
/**
* java.lang.AssertionError:
* Expected :null
* Actual :F0
*/ …Run Code Online (Sandbox Code Playgroud) 我在 kotlin 中使用了一个模拟库,在测试中,我有以下例外:
java.lang.RuntimeException: Method getStackTraceString in android.util.Log not mocked. See http://g.co/androidstudio/not-mocked for details.
Run Code Online (Sandbox Code Playgroud)
我找不到解决方案。