Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在机器人分子单元测试中断言void方法_Android_Unit Testing_Robolectric_Android Testing - Fatal编程技术网

Android 如何在机器人分子单元测试中断言void方法

Android 如何在机器人分子单元测试中断言void方法,android,unit-testing,robolectric,android-testing,Android,Unit Testing,Robolectric,Android Testing,如何在Robolectric测试用例中验证void方法调用,因为没有数据来自被调用的方法 在这种情况下应该主张什么?下面给出了一个需求示例 public class SampleClass(){ final String TAG = SampleClass.class.getSimpleName(); public void log(){ Log.d(TAG, "Entry Loggd"); } } @Test public void logEnt

如何在Robolectric测试用例中验证void方法调用,因为没有数据来自被调用的方法

在这种情况下应该主张什么?下面给出了一个需求示例

public class SampleClass(){

    final String TAG = SampleClass.class.getSimpleName();

    public void log(){
        Log.d(TAG, "Entry Loggd");
    }

}

@Test
public void logEntry_test(){

    SampleClass sc = new SampleClass();
    sc.log();

    // What to assert here to verify this log method

}

首先,写测试对你有好处!!!有几种方法可以测试内部记录器是否被调用。同样重要的是,了解您要测试的内容。测试一个类是否正在记录特定消息很可能是一个错误,因此请预先警告,您可能不需要它

方法#1:使用机器人分子 Robolectic文档不适合回答基本问题,但它的代码库在测试中有很好的文档记录。对它的原理有一个基本的了解,可以让你走很长的路。为这一解决方案奠定基础

@RunWith(RobolectricTestRunner.class)
public class SampleClassTest {
    @Test
    public void log_writesExpectedMessage() {
        new SampleClass().log();

        ShadowLog.LogItem lastLog = ShadowLog.getLogs().get(0);
        assertThat(lastLog.msg).isEqualTo("some message");
        // or
        assertThat(lastLog.msg).isNotNull();
    }
}
使用Robolectric v3.1.2进行测试 将以下内容添加到
build.gradle
文件中:

testCompile 'org.robolectric:robolectric:3.1.2'
方法#2:利用抽象 如果您的示例类派生自Android类(活动、片段、应用程序等),那么使用
Android.util.Log
是有意义的,但请记住,您的测试将需要是一个机器人分子测试或AndroidInstrumented测试。如果您的
SampleClass
只是一些POJO,那么使用一个简单的日志框架可能会使您的测试工作更容易。例如,使用Jake Wharton的,您的类和测试可以编写如下:

import timber.log.Timber;

public class SampleClass {
    void log() {
        Timber.d("some message");
    }
}

// SampleClassTest.java
public class SampleClassTest {
    // setting up a Tree instance that we define below
    TestTree testTree = new TestTree();

    @Test
    public void log_writesExpectedMessage() {
        // setting up Timber to us the test classes log writer
        Timber.plant(testTree);
        // invoke the logging function
        new SampleClass().log();
        // assert
        assertThat(testTree.lastMessage).isEqualTo("some message");
    }

    private class TestTree extends Timber.Tree {
        private String lastMessage;

        @Override
        protected void log(int priority, String tag, String message, Throwable t) {
            lastMessage = message;
        }
    }
}

祝你好运,考试愉快

据我所知,您想要模拟静态方法。我想,使用静态模拟并不是最优雅的测试方式。最好使用由推荐的抽象。虽然,它可以用

听起来OP只是给出了一个作为MCVE登录的方法,而不是显式地尝试测试日志消息。我现在正在寻找类似的东西-如何验证void方法的调用是否与mockitoverifyonmocks类似?您试图断言什么?日志消息?是否调用了Log.d()方法?log()方法执行时是否没有异常?