gpt4 book ai didi

java - Mockito:为什么私有(private)变量没有在模拟类中加载?

转载 作者:行者123 更新时间:2023-12-01 06:07:01 32 4
gpt4 key购买 nike

public class Manager {
private static url = SomeService.get();
public void method() {
....
}
}

@RunWith(MockitoJUnitRunner.class)
public class ManagerTest {
@InjectMocks
Manager manager = new Manager();
@Test
public void testMethod(){
manager.method();
}
}

当我尝试 InjectMock Manager 类时,我发现静态变量 url 为 null,并且未在 testMethod() 中初始化。有人告诉我我哪里做错了吗?

最佳答案

在 Mockito 中,@InjectMocks 没有任何魔法。它只是实例化带注释的被测系统 (SUT)(以防您自己实例化它),并调用相应的 setter 将模拟注入(inject)到 SUT 中。

回到你的代码,Mockito 无法改变你的 private static Final SomeUrl url = SomeService.get(); 的行为。这只是您真正的 SomeService.get() 返回 null

肯定有办法解决这个问题(通过使用 Powermock 或其他模拟库,如 JMockIt 等)。这里最大的问题是您的代码编写得不易于测试。尝试进行一些重构,例如:

  1. 在这种情况下请避免使用static
  2. 避免在 SUT 内创建依赖项(您需要模拟的依赖项)。应注入(inject)依赖项。

所以你的代码看起来像

public class Manager {
private SomeUrl url;

public void setUrl(SomeUrl url) { this.url = url; }

public void method() {
doSomethingOnUrl(this.url.getUrlString());
}
}

@RunWith(MockitoJUnitRunner.class)
public class ManagerTest {
@InjectMocks
Manager manager = new Manager();

@Mock
SomeUrl mockUrl; // <- This is the mock that will be injected by Mockito

@Test
public void testMethod(){
// Given
when(mockUrl.getUrlString()).thenReturn("SomeUrl");

// When
manager.method();

// Then
verify(mockUrl, times(1)).getUrlString();
}
}

关于java - Mockito:为什么私有(private)变量没有在模拟类中加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42405676/

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