Android Parameterized Test
If you have to make several test in one only method which provides parameters to be injected. The best practice is to add parameterized test
Addition operation is a good example:
/** * Addition operation */ public double add(double firstOperand, double secondOperand) { return firstOperand + secondOperand; }
The first step is to add these lines:
androidTestCompile 'com.android.support:support-annotations:24.0.0' compile 'com.android.support:support-annotations:24.0.0'
In app/build.gradle because We use JUnitRunner test annotations and parameterized.
Provides parameters to be injected into the
* test class constructor
@Parameterized.Parameters public static Iterable<Object[]> data() { return Arrays.asList(new Object[][]{ {0, 0, 0}, {0, -1, -1}, {2, 2, 4}, {8, 8, 16}, {16, 16, 32}, {32, 0, 32}, {64, 64, 128}}); }
{fistOperand, secondOperand, result}
This is the full class:
-Iterable
-Construtor
-Setup
-test
import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import android.test.suitebuilder.annotation.SmallTest; import com.thedeveloperworldisyours.unitconverterpro.calculator.Calculator; import com.thedeveloperworldisyours.unitconverterpro.calculator.CalculatorImpl; import java.lang.Iterable; import java.util.Arrays; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; /** * Created by javierg on 06/10/2016. */ @RunWith(Parameterized.class) @SmallTest public class CalculatorAddParameterizedTest { /** * @return {@link Iterable} that contains the values that should be passed to the constructor. * In this example we are going to use three parameters: operand one, operand two and the * expected result. */ @Parameterized.Parameters public static Iterable<Object[]> data() { return Arrays.asList(new Object[][]{ {0, 0, 0}, {0, -1, -1}, {2, 2, 4}, {8, 8, 16}, {16, 16, 32}, {32, 0, 32}, {64, 64, 128}}); } private final double mOperandOne; private final double mOperandTwo; private final double mExpectedResult; private Calculator mCalculator; /** * Constructor that takes in the values specified in * {@link CalculatorAddParameterizedTest#data()}. The values need to be saved to fields in order * to reuse them in your tests. */ public CalculatorAddParameterizedTest(double operandOne, double operandTwo, double expectedResult) { mOperandOne = operandOne; mOperandTwo = operandTwo; mExpectedResult = expectedResult; } @Before public void setUp() { mCalculator = new CalculatorImpl(); } @Test public void testAdd_TwoNumbers() { double resultAdd = mCalculator.add(mOperandOne, mOperandTwo); assertThat(resultAdd, is(equalTo(mExpectedResult))); } }
You can see a example in GitHub