java - 如何模拟类型转换的方法?

标签 java junit mockito

要测试的类

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 和 catch block 的大型 API。所以它内部某处抛出异常。

我只是想知道为什么模拟不起作用以及如何模拟这种类型的转换方法

最佳答案

我相信你编写实现的方式,不可能的原因是

AccessBeanFactory fact= new AccessBeanFactory();

相反你可以

@Autowired private AccessBeanFactory fact;

问题:- 每次您使用新创建的对象(而不是模拟对象)调用 fact.getAccessBean 而 bean 不可用时。所以它确实像预期的那样抛出 NPE

关于java - 如何模拟类型转换的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58909397/

相关文章:

java - 对于 OSGi 运行时可用的类型 ( io.netty.common ),出现 ClassNotFoundException

Android Studio Junit 测试包 org.junit 不存在

java - Java 中的相等性测试

android - Mockito 的 IllegalArgumentException

java.lang.VerifyError : Bad type on operand stack when trying to run HttpServer provided by JDK 错误

java - 如何验证从某个点开始,不再与模拟进行交互?

java - Android Studio 中使用 setOnClickListener 的循环

java - @PostConstruct 与 Jersey 1.17、Weblogic 一起使用

java - 分而治之递归矩阵乘法

junit - Arquillian : Attempted to register the same Observer, ServerSetupObserver 多次