TalClip
TalClip

Reputation: 79

How to implement dependency injection with JUnit 5?

I was trying to follow multiple tutorials about the subject but I cannot understand how they support DI. To my basic understanding, DI should be supported by supplying extended/implemented classes object to the test, so the test will be able to be executed with multiple variations of the objects.

For example:

@Test
public void myTest(Base baseObj){
   assertThis(baseObj);
   assertThat(baseObj);
}

class Base {
  //data
  //methods
}

class Class1 extends Base{}
class Class2 extends Base{}
class Class3 extends Base{}

There should be a way to supply objects of the derived classes to the test. Am I wrong till here?

I couldn't understand from the explanations, how TestInfo class for example (or the other classes) helps me with that?

Can you enlighten me please?

Upvotes: 0

Views: 657

Answers (1)

tgdavies
tgdavies

Reputation: 11411

You can do it like this:

public class Test1 {
    @ParameterizedTest
    @MethodSource("myTest_Arguments")
    public void myTest(Base baseObj){
        System.out.println(baseObj);
    }

    static Stream<Arguments> myTest_Arguments() {
        return Stream.of(
            Arguments.of(new Class1()),
            Arguments.of(new Class2()),
            Arguments.of(new Class3()));
    }
}

The entire code is:

package com.example.demo;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.stream.Stream;

class Base {}
class Class1 extends Base{}
class Class2 extends Base{}
class Class3 extends Base{}
public class Test1 {
    @ParameterizedTest
    @MethodSource("myTest_Arguments")
    public void myTest(Base baseObj){
        System.out.println(baseObj);
    }

    static Stream<Arguments> myTest_Arguments() {
        return Stream.of(Arguments.of(new Class1()),Arguments.of(new Class2()),Arguments.of(new Class3()));
    }
}

and the dependencies used are:

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.9.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.9.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.9.0</version>
            <scope>test</scope>
        </dependency>

Upvotes: 2

Related Questions