【问题标题】:Testing Activity Using Mockito Framework使用 Mockito 框架测试活动
【发布时间】:2017-04-23 10:18:44
【问题描述】:

下面是简单的计算器应用程序,我想使用 Junit4 和 mockito 框架对其进行测试,我在 Junit4 上测试了该应用程序,它工作正常,但我在 mockito 实现方面遇到问题

CalculatorOperationsInterfaces.java

public interface CalculatorOperationsInterfaces {
    public double add(double input1, double input2);
    public double subtract(double input1, double input2);
    public double multiply(double input1, double input2);
    public double divide(double input1, double input2);
}

MainActivity.java

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity implements CalculatorOperationsInterfaces {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public double add(double input1, double input2) {
        return (input1 + input2);
    }

    @Override
    public double subtract(double input1, double input2) {
        return (input1 - input2);
    }

    @Override
    public double multiply(double input1, double input2) {
        return (input1 * input2);
    }

    @Override
    public double divide(double input1, double input2) {
        if(input2==0)
            return -1;
        else
            return (input1 / input2);
    }
}

CalculatorOperationsMockTest.java

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

import static org.mockito.Mockito.when;

// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(MockitoJUnitRunner.class)
public class CalculatorOperationsMockTest {

    //@Mock annotation is used to create the mock object to be injected
    @Mock
    CalculatorOperationsInterfaces calcService;

    @Before
    public void setUp() {
        calcService = new MainActivity();
    }

    @After
    public void tearDown() {
        calcService = null;
    }


    @Test
    public void add(){
        //add the behavior of calc service to add two numbers
        when(calcService.add(10.0,20.0)).thenReturn(30.00);
        //test the add functionality
        Assert.assertEquals(calcService.add(10.0, 20.0),30.0,0);
    }

}

我使用Junit 成功测试了上述MainActivity.java,但是当我尝试运行CalculatorOperationsMockTest.java 文件时,我是Mockito 框架的新手,我收到以下错误,我不知道如何解决它

Class not found: "myappmania.local_jvm_unit_test.CalculatorOperationsMockTest"Empty test suite.

【问题讨论】:

    标签: mocking mockito junit4


    【解决方案1】:

    这里至少有3个问题:

    1. “空测试套件”错误消息的问题可以通过查看 this answer 来解决 - 确保您有一个指定 InstrumentationRunner 的运行配置。
    2. 您无法通过调用 new MainActivity() 来获取 Activity 的实例。正确的成语是:

      @Rule
      public ActivityTestRule<MainActivity> activityRule = new ActivityTestRule<>(MainActivity.class, true, false);
      

      然后:

      calcService = activityRule.launchActivity(null);
      
    3. 你没有通过模拟CalculatorService 来完成任何事情。测试时,您使用模拟来测试称为“被测系统”的程序的行为。在这里,您的被测系统是您对CalculatorService 的实现,即Activity。据我所知,您没有任何要注入的依赖项。希望this tutorial on mocking可以为你澄清这些概念。

    还请查看official tutorial for instrumented unit tests in Android 中的说明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2023-03-13
      • 2016-01-29
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多