当前位置: 首页 > 知识库问答 >
问题:

如何在Spring测试中给一个bean注入价值?

魏朗
2023-03-14

我这里有一个问题,请给出一些想法。

我有两个豆子。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'的值?

谢谢你!

共有1个答案

佴波鸿
2023-03-14

自定义值的最简单方法是使其成为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等。我不会得到模拟值。你知道怎么做吗?