gpt4 book ai didi

java - PowerMockito thenReturn 返回错误的对象

转载 作者:行者123 更新时间:2023-12-01 12:45:31 25 4
gpt4 key购买 nike

我在测试中使用 PowerMockito 模拟静态缓存。一般来说,缓存的工作原理是这样的:

Cache.getInstance().findEntityById(AbstractDTO);
// so, if I want a TypeA, I use:
TypeADTo typeADTO = // go the dto from the db ...
TypeA = Cache.getInstance().findEntityById(typeADTO);

静态缓存在应用程序中被广泛使用。因此,为了在单元测试中使用它,我使用:

    PowerMockito.mockStatic( Cache.class );
final Cache mockedCache = PowerMockito.mock( Cache.class );
PowerMockito.when( Cache.getInstance() ).thenReturn( mockedCache );
// mock all I want to get
TypeA typeA = new TypeA(some parameters);
TypeB typeB = new TypeB(some parameters);

PowerMockito.when(
Cache.getInstance().findEntityByBusinessId(
Mockito.any( TypeADTO.class ) ) ).thenReturn( typeA );
PowerMockito.when(
Cache.getInstance().findEntityByBusinessId(
Mockito.any( TypeADTO.class ), Mockito.anyBoolean() ) )
.thenReturn( typeA );


PowerMockito.when(
Cache.getInstance().findEntityByBusinessId(
Mockito.any( TypeBDTO.class ) ) ).thenReturn(
tybeB );
PowerMockito.when(
Cache.getInstance().findEntityByBusinessId(
Mockito.any( TypeBDTO.class ), Mockito.anyBoolean() ) )
.thenReturn( typeB );

我为所有需要的类型创建了一些模拟语句。 (正如您所看到的,有不止一种方法需要针对一种类型进行模拟)

问题是:power mockito 总是返回在最后一个 PowerMockito.when(...) 语句中设置的对象。

最佳答案

您尝试过链接调用吗?此外,您还可以使用 Mockito 的 when 单词。

Mockito.when(Cache.getInstance().findEntityByBusinessId(any(TypeBDTO.class),anyBoolean()))
.thenReturn( typeA )
.thenReturn( typeB );

这将按照该顺序准确记录模拟。

供将来引用的完整示例:

@RunWith(PowerMockRunner.class)
@PrepareForTest({BusinessUtility.class})
public class BusinessUtilityTest {

@Before
public void setUp() {
PowerMockito.mockStatic(BusinessUtility.class);
}

@Test
public void testStatic() {
when(BusinessUtility.getDate())
.thenReturn(new Date(1111))
.thenReturn(new Date(2222));

assertThat(BusinessUtility.getDate()).hasTime(1111);
assertThat(BusinessUtility.getDate()).hasTime(2222);
}
}

提示:

  • 使用静态导入使代码更具可读性
  • 使用 PowerMockito 只是为了初始化您的静态类,然后继续使用 Mockito
  • 尽可能避免静态类,测试会更困难,如您所见;)

编辑 ----------------------------------------------------------

看一下这个示例,它与您当前的用例类似:

类(class):

static class BusinessUtility {
public static <T> T getObject(T instance) {
return null;
}

public static <T> T getObject(T instance, Boolean b) {
return null;
}
}

测试:

@Test
public void testStatic() {
//arrange
when(BusinessUtility.getObject(anyString()))
.thenReturn("one")
.thenReturn("two");

when(BusinessUtility.getObject(any(Date.class), anyBoolean()))
.thenReturn(new Date(1111))
.thenReturn(new Date(2222));

//act
String firstStr = BusinessUtility.getObject("asdf");
String secondStr = BusinessUtility.getObject("qwerty");

Date firstDate = BusinessUtility.getObject(new Date(), true);
Date secondDate = BusinessUtility.getObject(new Date(), false);

//assert
assertThat(firstStr).isEqualTo("one");
assertThat(secondStr).isEqualTo("two");

assertThat(firstDate).isEqualTo(new Date(1111));
assertThat(secondDate).isEqualTo(new Date(2222));
}

关于java - PowerMockito thenReturn 返回错误的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24739947/

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