Mock Objects Created Inside方法在测试中验证传递的参数

时间:2018-05-23 14:56:50

标签: java junit mocking mockito jmockit

有一个方法如下 -

Class A
{

public void methodA(String zipcode)

{

  Country c= new Country(zipcode) 

}

}

是否可以使用JUnit进行验证,国家/地区对象是使用参数zipcode创建的。

测试方法将像

一样
@Test
public void testMethod()
{
  A a = new A();  
  a.methodA("testCode");
}

由于

3 个答案:

答案 0 :(得分:1)

如果您想使用PowerMockito,您可以轻松完成that

@RunWith(PowerMockRunner.class)
@PrepareForTest(X.class)
public class XTest {
        @Test
        public void test() {
                whenNew(MyClass.class).withNoArguments().thenThrow(new IOException("error message"));

                X x = new X();
                x.y(); // y is the method doing "new MyClass()"

                ..
        }
}

使用PowerMockito.verifyNew,例如

verifyNew(MyClass.class).withNoArguments();

答案 1 :(得分:1)

如果你确实需要测试调用(而不仅仅是它的效果,你可以做的是在测试类中引入工厂方法。

Class A {
    private Function<String,Country> createCountry = Country::new;
    public void methodA(String zipcode) {
          Country c= createCountry.apply(zipCode);
    }
}

然后你可以模拟。

class ATest {
    @InjectMocks A sut;
    @Mock Function<String,Country> creator;

    @Test public void testCountryCreated() {
        String zipcode = "1234";

        Country country = mock(Country.class);
        when(creator.apply(zipcode)).thenReturn(country);

        sut.methodA(zipcode);

        verify(creator).apply(zipcode);
    }
}

答案 2 :(得分:0)

你可以尝试这样的事情。

public class MyClass {
static class Country{
    public Country(String zipcode){
        onCountryCreated();
    }
    public void onCountryCreated(){

    }
}

@Test
public static void test() {
    Country cntry = new Country("12345"){
        @Override
        public void onCountryCreated(){
            System.out.println("Created");
            //assert true;
        }
    };
}
}