Java 如何模拟类型为casted的方法?
要测试的类Java 如何模拟类型为casted的方法?,java,junit,mockito,Java,Junit,Mockito,要测试的类 public class KnockoutValidation { public boolean runFormValidation(String param1, boolean param1, final String param3) { //... AccessBeanFactory fact = new AccessBeanFactory(); AccessBean bean = (AccessBe
public class KnockoutValidation {
public boolean runFormValidation(String param1, boolean param1, final String param3) {
//...
AccessBeanFactory fact = new AccessBeanFactory();
AccessBean bean = (AccessBean) fact.getAccessBean("abc", "xyz");
//....
}
}
测试类
@RunWith(MockitoJUnitRunner.class)
public class KnockOutValidationTest {
@InjectMocks
KnockoutValidation KnockoutValidationMock;
@Mock
AccessBeanFactory factMock;
AccessBean accessBean;
@Before
public void setUp() {
accessBean = new AccessBean();
when(factMock.getAccessBean(anyString(), anyString())).thenReturn(accessBean);
}
@Test
public void doKnockoutValidationTest() {
Boolean result = KnockoutValidationMock.runFormValidation("a", true, "c");
Assert.assertEquals(result, true);
}
}
即使在模拟之后,它也会调用实际的实现并抛出异常
java.lang.NullPointerException
理想情况下,当我们模拟它时,它不应该执行实际的方法,这里它将进入getAccessBean方法,这又是一个包含大量try-and-catch块的大型API。所以它内部的某个地方抛出了一个异常
我只是想知道为什么mock不起作用,以及如何模拟这种类型的强制方法,在这种情况下@InjectMock不会起作用,因为您正在使用新的构造函数创建AccessBeanFactory
AccessBeanFactory fact= new AccessBeanFactory();;
您应该将其作为类的字段,然后InjectMock将工作,或者最好将工厂作为参数传递
下面是一个应该有效的例子@InjectMock按类型工作,这意味着它将通过反射搜索类的字段,并注入您使用@Mock注释指定的Mock
public class KnockoutValidation {
@Autowired
AccessBeanFactory fact;
public boolean runFormValidation(String param1, boolean param1, final String param3) {
//...
AccessBean bean = (AccessBean) fact.getAccessBean("abc", "xyz");
//....
}
}
您也可以尝试使用PowerMockito的whenNew,它实际上将应用于内联类的创建,但这是一条您应该避免的黑暗道路,并且只用于第三方代码。我相信您编写实现的方式,这是不可能的,原因是 AccessBeanFactory事实=新建AccessBeanFactory() 相反,你可以
@Autowired private AccessBeanFactory事实代码>
问题:-当bean不可用时,每次使用新创建的对象(而不是模拟对象)调用fact.getAccessBean时。所以它确实像预期的那样抛出NPE静态方法使用的Power Mockito,我看不到Power Mockito在这个地方有任何用途,我不理解否决票和你的推理。你是说你只能用PowerMockito创建大多数静态方法吗?因为那不是真的。当您在PrepareForTest中指定ProxyClass时,Powermockito将创建一个ProxyClass,这就是它覆盖新类创建的方式。感谢您的反馈@JSONstatham。我写过这样的东西AccessBeanFactory事实;菜豆;事实=新的AccessBeanFactory();bean=(AccessBean)fact.getAccessBean(“abc”、“xyz”)代码>\uu我不认为@InjectMock有问题。\uu请您详细解释一下。用示例代码更新了我的答案,并做了更多解释。是的,非常感谢@JSONStatham……您给出的答案绝对正确……不过,还有一些方法是通过使用新关键字创建的对象调用的,有没有办法模仿那些方法。