0

I was going through this tutorial which sets up the SUT using a constructor but my question is what if there is no constructor e.g. if we have:

@Autowire private PetRepository petRepository;
@Autowire private VetRepository vetRepository;
@Autowire private OwnerRepository ownerRepository;
@Autowire private VisitRepository visitRepository;

in the service/controller. How we can set this up?

Jonathan
  • 20,053
  • 6
  • 63
  • 70
anjibcs
  • 80
  • 1
  • 14

2 Answers2

0

I prefer to annotate the setters instead of the attributes on the classes. For example:

public class SomeClass implements SomeInterface {

   private PetRepository petRepository;
   private VetRepository vetRepository;
   private OwnerRepository ownerRepository;
   private VisitRepository visitRepository;

   ... some methods ...

   @Resource
   public void setPetRepository(PetRepository petRepository) {
        this.petRepository= petRepository;
   }

   @Resource
   public void setVetRepository(VetRepository vetRepository) {
        this.petRepository= vetRepository;
   }

   @Resource
   public void setOwnerRepository(OwnerRepository ownerRepository) {
        this.ownerRepository = ownerRepository;
   }

   @Resource
   public void setVisitRepository(VisitRepository visitRepository) {
        this.visitRepository= visitRepository;
   }

}

Then you can create a test case like this with Mockito and Junit:

public class SomeClassTestCase {

  @Mock 
  private PetRepository petRepository;

  @Mock 
  private VetRepository vetRepository;

  @Mock 
  private OwnerRepository ownerRepository;

  @Mock 
  private VisitRepository visitRepository;

  private SomeClass someClass;

  @Before
  public void before(){
     MockitoAnnotations.initMocks(this);
     someClass = new SomeClass();
     someClass.setPetRepository(petRepository);
     someClass.setVetRepository(vetRepository);
     someClass.setOwnerRepository(ownerRepository);
     someClass.setVisitRepository(visitRepository);
  }

  @Test
  public void someTest() {
    ...
  }

}

Hope it helps.

Gerard Ribas
  • 717
  • 1
  • 9
  • 17
0

You can use Mockito's @InjectMocks annotation. This will instantiate and then inject the Mock dependencies, for example:

@RunWith(MockitoJUnitRunner.class)
public ServiceTest {

    @Mock
    PetRepository petRepository
    // ...omitted mocks ...

    @InjectMocks
    ClinicServiceImpl service;

}

See the documentation for further usage examples and caveats.

Jonathan
  • 20,053
  • 6
  • 63
  • 70