相关疑难解决方法(0)

用Mockito模拟静态方法

我写了一个工厂来生产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来测试我的测试用例.有没有一种很好的方法来模拟/验证这个特定的用例?

java unit-testing mocking mockito

321
推荐指数
12
解决办法
61万
查看次数

AndroidStudio/Gradle with powermock

我找不到有关如何使用Android Studio/Gradle设置powermock的任何信息.我尝试过的所有内容都会导致构建异常.

任何人都可以展示出正确的方法吗?

谢谢.

android powermock gradle

44
推荐指数
4
解决办法
2万
查看次数

如何处理 Android JUnit 测试中的日志记录?

我想在模型类中记录信息 - 不一定用于单元测试目的,而是用于我尝试调试的现实生活场景。

但是,如果我尝试使用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方法,这可能会以相同的方式再次中断。

那么,是否有我可以使用的“一网打尽”类型的行为?你怎么认为?

junit android unit-testing android-testing

7
推荐指数
1
解决办法
2650
查看次数

Android Unit Test在Log上抛出NoClassDefFoundError

我得到一个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)

java junit android unit-testing

6
推荐指数
1
解决办法
5586
查看次数

我该如何模拟和测试这门课?

以下是我想测试的代码.

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)

android unit-testing mockito

3
推荐指数
1
解决办法
1329
查看次数

如何模拟 android.util.Log

我在 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)

我找不到解决方案。

android kotlin mockk

1
推荐指数
1
解决办法
820
查看次数