JUnitParams with Mockito

3k Views Asked by At

This could be a XY problem but I want to ask:

I am using JUnitParams to be able to run my test method 10 times with different objects. The problem is that the injections don't work (@Mock and @InjectMocks). I can use

PersonService personService = mock(PersonServiceImpl.class)

to mock the PersonService in the @Test method. But how do mock the "main" object that is annotated with @InjectMock? Maybe it is not possible and JUnitParams was only created for simple test cases that they exemplify with on their site.

If I can't use JUnitParams, what can I do instead? I have tried

@RunWith(value = Parameterized.class)

but that doesn't work either.. I think..

What I have:

@RunWith(JUnitParamsRunner.class)
public class SkapaKundMasterDataTest {

    @InjectMocks
    private SkapaKundMasterData batch;

    @Mock
    private PersonService personService;

    @Mock
    private UtbetalningService utbetalningService;

    @Mock
    private Användare user;

    public Collection<PersonA[]> paramz() {

        List<PersonA[]> params = new ArrayList<>();
        params.add(new PersonA[] {new PersonA(new PersonId(1111111111111L), new Personnummer(195001019999L), Datum.skapaDatum(1950, 1, 1), AllaArbetstagarFörEnPerson.utanArbetstagare(), null, null, null, null, null, false, null)});
        params.add(new PersonA[] {new PersonA(new PersonId(2222222222222L), new Personnummer(195102029999L), Datum.skapaDatum(1951, 2, 2), AllaArbetstagarFörEnPerson.utanArbetstagare(), null, null, null, null, null, false, null),});
        params.add(new PersonA[] {new PersonA(new PersonId(3333333333333L), new Personnummer(195203039999L), Datum.skapaDatum(1952, 3, 3), AllaArbetstagarFörEnPerson.utanArbetstagare(), null, null, null, null, null, false, null)});
        params.add(new PersonA[] {new PersonA(new PersonId(4444444444444L), new Personnummer(195304049999L), Datum.skapaDatum(1953, 4, 4), AllaArbetstagarFörEnPerson.utanArbetstagare(), null, null, null, null, null, false, null)});
        params.add(new PersonA[] {new PersonA(new PersonId(5555555555555L), new Personnummer(195405059999L), Datum.skapaDatum(1954, 5, 5), AllaArbetstagarFörEnPerson.utanArbetstagare(), null, null, null, null, null, false, null)});
        params.add(new PersonA[] {new PersonA(new PersonId(6666666666666L), new Personnummer(195506069999L), Datum.skapaDatum(1955, 6, 6), AllaArbetstagarFörEnPerson.utanArbetstagare(), null, null, null, null, null, false, null)});
        params.add(new PersonA[] {new PersonA(new PersonId(7777777777777L), new Personnummer(195607079999L), Datum.skapaDatum(1956, 7, 7), AllaArbetstagarFörEnPerson.utanArbetstagare(), null, null, null, null, null, false, null)});
        params.add(new PersonA[] {new PersonA(new PersonId(8888888888888L), new Personnummer(195708089999L), Datum.skapaDatum(1957, 8, 8), AllaArbetstagarFörEnPerson.utanArbetstagare(), null, null, null, null, null, false, null)});
        params.add(new PersonA[] {new PersonA(new PersonId(9999999999999L), new Personnummer(195809099999L), Datum.skapaDatum(1958, 9, 9), AllaArbetstagarFörEnPerson.utanArbetstagare(), null, null, null, null, null, false, null)});
        params.add(new PersonA[] {new PersonA(new PersonId(1234567891234L), new Personnummer(195910109999L), Datum.skapaDatum(1959, 10, 10), AllaArbetstagarFörEnPerson.utanArbetstagare(), null, null, null, null, null, false, null)});

        return params;
    }

    @Test
    @Parameters(method = "paramz")
    public void alltOk(PersonA dummy) throws BaseException {
        MockitoAnnotations.initMocks(SkapaKundMasterDataTest.class);
        //PersonService personService = mock(PersonServiceImpl.class); //this works
        when(personService.HämtaPersonAFörKundMasterdata(any(), any())).thenReturn(Optional.of(dummy));

        Properties p = new Properties();
        p.put("skummisar", "Ja");
        JobbParametrar params = JobbParametrar.skapa(p);

        batch.uppgift(dummy.getPersonId(), params, new KörningsId(0), any());
    }
}
2

There are 2 best solutions below

0
Absurd-Mind On BEST ANSWER

You cannot have two different runners simultaneously, but you can setup Mockito with a Rule. Just add the following to your test class while keeping the JUnitParamsRunner:

@Rule
public MockitoRule rule = MockitoJUnit.rule();
0
ImVikash_0_0 On

As mentioned above, you cannot use two different runners simultaneously.

But there's another way to use both JUnitParamsRunner.class and MockitoJUnitRunner.class.

MockitoJUnitRunner.class is used to create mocked instances of classes annotated with @Mock. But the same think can be done with MockitoAnnotations.initMocks(this).

So, the whole test class would look something like this:

@RunWith(JUnitParamsRunner.class)
public class SkapaKundMasterDataTest {

   @InjectMocks
   private SkapaKundMasterData batch;

   @Mock
   private PersonService personService;

   @Mock
   private UtbetalningService utbetalningService;

   @Mock
   private Användare user;

   @Before
   public void setup() {
     MockitoAnnotations.initMocks(this);
   }
   ...
   ...
}

By the way, constructor injection is preferred over field injection.