我需要实现假单元测试我的一种方法。问题是我需要测试调用类方法并检索一些系统参数的方法。场景如下:
Class A(){
public void method xx(){
//This needs to be tested.
//This method makes a call to retrieve some informations. The call is like
below:
String culture=Api.GetEnvironmentData().GetCulture();
//This is the problem area.
boolean implmentApi=Api.GetEnvironmentData().DoImplmentApi();
//This is the problem area.
}
}
这个GetEnvironmentData方法是这样的:
public static EnvironmentData GetEnvironmentData ()
{
return GetDiContainer().Resolve<EnvironmentData >();
}
EnvironmentData类是这样的:
public class EnvironmentData(){
public EnvironmentData(IEnvironmentDataProvider EnvironmentDataProvider){
//
}
}
我可以使用moq伪造IEnvironmentDataProvider但是我无法弄清楚如何伪造EnvironmentData类。我需要伪造EnvironmentData类,因为它根据各种方法调用操作了IEnvironmentDataProvider的结果。例如,GetCulture和DoImplmentApi都调用接口IEnvironmentDataProvider的getData方法,然后相应地转换它们。 现在,当我伪造IEnvironmentDataProvider并返回一些值时,我无法控制GetCulture和DoImplmentApi被调用时返回的内容。
有人可以建议如何实现上述情况的假货。
答案 0 :(得分:0)
您不需要模拟 EnvironmentData 类的依赖项。我在这里看到一个问题:你正在使用DI容器,比如Service Locator,在这种情况下它就像antipattern一样。应注入所有依赖项,例如: g。:通过构造函数或属性。
将 Api 类更改为以下内容:
public class Api
{
private readonly EnvironmentData _environmentData;
public Api(EnvironmentData envData)
{
environmentData = envData;
}
public string GetCulture()
{
return _envData.GetCulture();
}
}
请记住,应该隐藏Api类的实现细节。您不应在此方案中公开 EnvironmentData 。 Api 类应该要求实现此类所需的所有依赖项并具有自己的接口。
答案 1 :(得分:0)
根据您的评论,我认为您最好的方法是将静态类包装在外观中。然后你可以嘲笑门面。
这样的事情:
Class A
{
IEnvironmentDataFacade _environmentDataFacade;
Class A(IEnvironmentDataFacade environmentDataFacade)
{
_environmentDataFacade = environmentDataFacade;
}
public void method xx()
{
//Now you can fake IEnvironmentDataFacade:
String culture= _environmentDataFacade.GetCulture();
//Do the same as above with the method here:
boolean implmentApi=Api.GetEnvironmentData().DoImplmentApi();
//This is the problem area.
}
}
public class EnvironmentDataFacade : IEnvironmentDataFacade
{
public string GetCulture()
{
return Api.GetEnvironmentData().GetCulture();
}
}
public interface IEnvironmentDataFacade
{
string GetCulture();
}