30 Aralık 2019 Pazartesi

PowerMockito whenNew + withAnyArguments + thenReturn Kullanımı - Unit Under Test İçinde Yaratılan Nesneyi Mocklar

Giriş
Kendi sınıfım içinde dışarıdan verilmeyen ancak new'lenen nesneyi mocklamak için kullanılır. Unit Under Test yani kendi sınıfımı @PrepareForTest anotasyonu ile PowerMock'a test başında göstermek gerekir.

Örnek
Şöyle yaparız. Burada Unit Under Test içinde new'lenen mock nesneyi Mockito ile yaratıyoruz.
ConcreteClass concreteObject = mock(ConcreteClass.class);
PowerMockito.whenNew(ConcreteClass.class)
  .withAnyArguments().thenReturn(concreteObject);
Örnek
Elimizde şöyle bir kod olsun
class ToBeTest{
  public ToBeTest(){}
    public boolean doWork(){
        OtherObject obj=new OtherObject();
        return obj.work();
    }
}
Şöyle yaparız
@Test
public void testDoWork() throws Exception{

  MyTest mytest = new MyTest();

  OtherObj obj = new OtherObj();
  obj.test="mocked Test"; //here you can add any other needed values to obj

  PowerMockito.whenNew(OtherObj.class).withNoArguments().thenReturn(obj);

  String result = mytest.doWork();
  Assert.assertTrue(result.equalsIgnoreCase("mocked Test"));
}
Örnek

Şöyle yaparız. Burada Unit Under Test içinde new'lenen mock nesneyi Mockito ile yaratıyoruz.
@RunWith(PowerMockRunner.class)
@PrepareForTest(CustomerContactDaoImpl.class)//the class creating the new instance
public class CustomerContactDaoImplTest {

    @Mock
    JdbcTemplate jdbcTemplateMock; //YOUR MOCK TO BE INJECTED

    @InjectMocks
    CustomerContactDaoImpl customerContactDaoImpl;

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

  @Test
  public void insertCustomerContactTest() throws Exception {
    //Arrange
    Contact contact = ...

    SimpleJdbcCall mockedSimpleJdbcCall = Mockito.mock(SimpleJdbcCall.class);
  
    PowerMockito.whenNew(SimpleJdbcCall.class).withArguments(jdbcTemplateMock)
      thenReturn(mockedSimpleJdbcCall);

    //Act
    customerContactDaoImpl.insertCustomerContact(contact);

    //Assert
    ...
  }
}
Örnek
Elimizde şöyle bir kod olsun.
public class ClassIWantToTest {
    private ClassIWantToMock anotherClass;
    public ClassIWantToTest() {
        //some stuff
        anotherClass = new ClassIWantToMock(); //<-- call constructor to build the field
        //some other stuff
    }
}
Şöyle yaparız. Burada new'lenen mock nesneyi PowerMockito ile yaratıyoruz.
@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassIWantToTest.class,ClassIWantToMock.class})
public class ClassIWantToTest_Test {
  @Test
  public void myFirstTest() {
    ClassIWantToMock myMock = PowerMockito.mock(ClassIWantToMock.class);
    PowerMockito.whenNew(ClassIWantToMock.class).withAnyArguments().thenReturn(myMock); 
    ClassIWantToTest test = new ClassIWantToTest(); //<-- not mocked
  }
}

Hiç yorum yok:

Yorum Gönder