gpt4 book ai didi

java - 如何模拟由MyBatis初始化的接口(interface)的引用?

转载 作者:行者123 更新时间:2023-12-02 13:39:40 25 4
gpt4 key购买 nike

在标记此Answer的重复之前,了解答案并不能解决我的问题。答案给出了一个解决方案,我在当前方法中使用 when() 。在我的问题中,UserDao 正在被初始化,而在测试方法内部的其他地方则无法传递模拟对象。

<小时/>

有一个由MyBatis初始化的接口(interface)引用。我无法在测试中直接模拟它,因为该对象没有传递到测试的主题中。我必须通过模拟构造函数来对其进行 PowerMock。由于没有构造函数调用该接口(interface),PowerMock 会抛出异常。

java.lang.ArrayIndexOutOfBoundsException: 0

at org.powermock.api.mockito.internal.expectation.AbstractConstructorExpectationSetup.withAnyArguments(AbstractConstructorExpectationSetup.java:100)

这是代码的样子

class UserServiceTest{

@AutoWired
UserService userService;

@Mock
UserDao userDao;//This is a reference to the interface (UserDao) which is mapped using MyBatis

@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
//The Program fails at the below statement
PowerMockito.whenNew(UserDao.class).withAnyArguments().thenReturn(userDao);
@Test
public void testFetchDetails() throws Exception {
when(userDao.fetchDetails(any(ParameterOne.class)).thenReturn(null);
assertThat(userService.fetchDetails(new ParameterOne())).isNull();
}

}

如果我在没有 PowerMock 的情况下运行程序,则会访问实际数据库并返回正确的结果。访问数据库还会导致测试运行时间减慢最多 500 毫秒。

如何模拟 UserDao userDao?如果我无法模拟在这种情况下如何执行单元测试。我无法更改正在测试的代码。

附注如果您仍然建议我避免使用 PowerMock,请在这种情况下提出“更好”的替代方案。

P.P.S 请注意,我不是在测试 Dao 层,而是测试使用 Dao 层的服务,因此,我必须模拟 DaoLayer 来检查服务的行为是否正确。

最佳答案

该应用程序是一个 spring-boot 应用程序。我对被测试的类使用了@InjectMocks,对任何需要模拟的对象使用了@Mock。

@RunWith(SpringRunner.class)    
class UserServiceTest{
@InjectMocks
UserService userService;

@Mock
UserDao userDao;//This is a reference to the interface (UserDao) which is mapped using MyBatis

...
}

这有效,我可以直接在模拟对象上使用when()/given()。

关于java - 如何模拟由MyBatis初始化的接口(interface)的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42803171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com