gpt4 book ai didi

java - 使用 Mockito 模拟字段注入(inject)

转载 作者:行者123 更新时间:2023-12-02 09:54:12 24 4
gpt4 key购买 nike

我是 JUnit PowerMockito 的新手。我尝试测试类中的方法。该类具有 Autowiring 字段。服务等级

@Service
public class MyServiceRegistration
{


@Autowired
private AppConfig appConfig;


public void register() throws xception
{
//Do some thing
}
}

应用程序配置

@Component
public class AppConfig
{
@Value("${spring.application.name}")
private String applicationName;

@Value("${server.port}")
private String serverPort;
//getter and setter
}

测试类

@RunWith(PowerMockRunner.class)
@PrepareForTest({ AppConfig.class })
@PowerMockIgnore({ "javax.management.*" })
public class MyServiceRegistrationTest
{
@InjectMocks
MyServiceRegistration myServiceRegistration = new MyServiceRegistration();
@Mock
private AppConfig appConfig;

@Before
public void setUp() throws Exception
{
PowerMockito.when(AppConfig.getApplicationName()).thenReturn("SomeValue");
MockitoAnnotations.initMocks(this);
}

public final void testRegister() throws Exception
{

myServiceRegistration.register();
}
}

当我调试代码时,我可以看到 AppConfig 被模拟。但 applicationName 和 serverPort 字段为空。

调试屏幕

enter image description here

如何解决这个问题?

最佳答案

您的代码的问题是您注入(inject)了两次模拟。

  • 首先,它们由@RunWith(PowerMockRunner.class)注入(inject)
  • 第二次,手动使用 MockitoAnnotations.initMocks(this);

您在第一个实例上设置期望,然后覆盖模拟,这就是期望不存在的原因。

为了证明这一点

@Before
public void setUp() throws Exception
{
PowerMockito.when(appConfig.getApplicationName()).thenReturn("SomeValue");
AppConfig beforeInitMocks = appConfig;
MockitoAnnotations.initMocks(this);
AppConfig afterInitMocks = appConfig;
System.out.println("Same object?: " + (beforeInitMocks == afterInitMocks));
}

注意:我认为您的帖子中有一个拼写错误,您应该有 PowerMockito.when(appConfig.getApplicationName()) (使用小写的 appConfig)

关于java - 使用 Mockito 模拟字段注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56114761/

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