Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何模拟类型为casted的方法?_Java_Junit_Mockito - Fatal编程技术网

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……您给出的答案绝对正确……不过,还有一些方法是通过使用新关键字创建的对象调用的,有没有办法模仿那些方法。