我这里有一个问题,请给出一些想法。
我有两个豆子。FaceComparisonServerImpl依赖于FaceServer。当我想测试的时候。我想更改我的'FaceServer'bean中的字符串。
@Service
public class FaceComparisonServerImpl implements FaceComparisonServer {
@Autowired
private FaceServer faceServer;
@Override
public FaceComparsionInfo getServerInfo() {
String serverInfo = faceServer.getServerInfo();
...
}
}
@Component
public class FaceServer {
@Autowired
private RestTemplate restTemplate;
//Not final, just to test.
private String version = "1.0";
private static final String CODE = "code";
private static final String MESSAGE = "message";
//Final
private static final String SERVER_URL = "http://127.0.0.1:8066/api/ZKComparison";
}
贝娄是我的测试代码。
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = TestConfig.class)
public class FaceServerTestByTyler {
@Autowired
private FaceComparisonServer faceComparisonServer;
@Test
public void getServerInfo(){
//How can i modify the value of SERVER_URL in faceServer?
FaceComparsionInfo serverInfo = faceComparisonServer.getServerInfo();
System.out.println(serverInfo);
}
}
我的问题是:我如何修改@bean(faceServer)中'version'和'server_url'的值?
谢谢你!
自定义值的最简单方法是使其成为Spring属性:
@Component
public class FaceServer {
@Value("${faceServer.version}")
private String version;
@Value("${faceServer.url}")
private String serverUrl;
// ...
}
您可以为@value
批注设置默认值,也可以在application.yml
中使用一些默认属性值。
现在只需在测试中用所需的值重写这些属性:
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = TestConfig.class)
@TestPropertySource(properties = {
"faceServer.version=1.0",
"faceServer.url=http://127.0.0.1:8066/api/ZKComparison"
})
public class FaceServerTestByTyler {
@Autowired
private FaceComparisonServer faceComparisonServer;
// ...
}
然而...
第二种选择是使类具有更好的单元可测试性。更喜欢构造注入而不是字段注入,并且您可以更独立地测试您的类。
@Service
public class FaceComparisonServerImpl implements FaceComparisonServer {
private final FaceServer faceServer;
public FaceComparisonServerImpl(FaceServer faceServer) {
this.faceServer = faceServer;
}
@Override
public FaceComparsionInfo getServerInfo() {
String serverInfo = faceServer.getServerInfo();
// ...
}
}
这现在变成了单元可测试的:
public class FaceServerTestByTyler {
private FaceComparisonServer faceComparisonServer;
private FaceServer faceServer;
@BeforeEach
public setup() {
faceServer = mock(FaceServer.class);
faceComparisonServer = new FaceComparisonServer(faceServer);
}
@Test
public void getServerInfo() {
when(faceServer.getServerInfo()).thenReturn(xxx);
// ...
}
}
第二个选项最终得到一个测试,它的运行速度比任何建议通过测试配置创建模拟bean的解决方案都快得多。
我有一个类< code >配置: 配置java 我如何将它注入到某个构造函数中,例如: 我希望这个字符串 从配置中注入了值。这可能吗?
当我测试我的Spring boot服务时,我不知道如何注入一个@Autowired bean。 My bean(Spring填充@Value fromapplication.yml): 我的 api: 这很好,int值是正确的。这是我的测试: 在这个测试评论中,我如何通过@Autowired进入ListenerApi? 谢谢。
我正在开发一个遗留的JSF应用程序,我们正在慢慢地将其移植到Spring MVC。我们正在使用Spring Security来控制登录信息。在用户登录之后,JSF页面全局地实例化一个在任何地方都使用的会话作用域bean。我想更改应用程序,这样我们就可以先进入用Spring MVC开发的页面。 我尝试的一种方法是将bean转换为spring bean,并将其注入JSF,但不幸的是,这需要对bean进
在spring initialize之后,我希望将第二个bean的属性值合并到第一个bean中。请告知spring是否提供了动态注入值的类。
问题内容: 我使用SpringBeanAutowiringSupport在某些对象中进行bean注入。问题是,在jUnit测试中无法注入bean。为了进行测试,使用了SpringJUnit4ClassRunner。 有谁知道,为什么使用注入在jUnit测试中不起作用? 问题答案: 感谢M. Denium的帮助,他的解决方案得以奏效。
我对单元测试有问题。下面是示例代码片段。我模拟了一个bean,并将其注入@configuration类,然后使用mocked属性创建另一个bean。 在下面的示例中,如果我检查,b.getSomething()会返回默认值,如字符串为“”,int为0等。我不会得到模拟值。你知道怎么做吗?