【单元测试】通过反射,我成功修改了静态成员中的静态变量。。。可是,如何修改静态方法的返回值?

张天星 2018-10-15 10:57:59
//假如说,public static string GetDb()返回的不是静态成员变量Db,而是直接返回"zzw",那么我应该怎么修改这个返回值?
而如果测试的方法中实例化了一个类,那么类的成员调用怎么替换?
    class StaticDb
{
private static string Db = "zzw";
public static string GetDb()
{
return Db; //假如说,这里返回的不是静态成员变量Db,而是直接返回"zzw",那么我应该怎么修改这个返回值?
}
}
class ClassDb
{
private string Db = "zzw2";
public string GetDb()
{
return Db;
}
}
public class User
{
private string name = "实例名";
public User()
{

}
public string GetUser()
{
//测试的时候,这个GetDb的返回值如何注入。
return StaticDb.GetDb();
}
public string GetUser2()
{
//如果内部是实例了一个对象之后运行的,那么怎么修改这个实例对象的GetDb()的返回值?
ClassDb classDb = new ClassDb();
return classDb.GetDb();
}
}
static void Main(string[] args)
{
StaticTest();
//College();
//WriteTest();
}
public static void StaticTest()
{
//直接访问静态方法
string result = StaticDb.GetDb();
Console.WriteLine("直接访问静态方法:" + result);

//反射访问静态方法
Assembly asm = Assembly.Load("Reflection");
Type type = asm.GetType("Reflection.StaticDb");
MethodInfo method = type.GetMethod("GetDb");
result = method.Invoke(null, null).ToString();
Console.WriteLine("反射访问静态方法:" + result);

//反射修改静态方法调用的那个静态变量
BindingFlags flag = BindingFlags.Static | BindingFlags.NonPublic;
FieldInfo field = type.GetField("Db", flag);
field.SetValue(asm, "zhangzw");
Console.WriteLine("反射修改静态方法调用的那个静态变量");
//直接访问静态方法
result = StaticDb.GetDb();
Console.WriteLine("直接访问静态方法:" + result);
//实例化一个测试类,测试类中的某个方法调用的静态方法
User user = new User();
result = user.GetUser();
Console.WriteLine("实例化一个测试类,测试类中的某个方法调用的静态方法:" + result);





Console.ReadLine();
}
...全文
982 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
张天星 2018-11-04
  • 打赏
  • 举报
回复
不要沉底,自顶一下,求解答
张天星 2018-10-26
  • 打赏
  • 举报
回复
不要沉底,自顶一下,求解答
CGabriel 2018-10-17
  • 打赏
  • 举报
回复
反射太麻烦了。。推荐使用 M$ 的 unity 做依赖注入 C#: Using Microsoft Unity dependency injection in Unit Tests http://gentlelogic.blogspot.com/2014/12/c-using-microsoft-unity-dependency.html Using a Unity Container with Dependency Injection for Unit Testing with ASP.NET MVC https://www.codeproject.com/Articles/33091/Using-a-Unity-Container-with-Dependency-Injection
张天星 2018-10-16
  • 打赏
  • 举报
回复
引用 5 楼 God_Girl 的回复:
你是想override一个?那你不如直接内存定义一个变量获取他返回值,你一直使用你存的这个变量撒。

override,嗯,我想做的确实是重写,不用过继承,直接改掉那个静态方法,就为了单元测试的时候伪装方法。
“直接内存定义一个变量获取他返回值,你一直使用你存的这个变量”这句话没听懂。
  • 打赏
  • 举报
回复
你是想override一个?那你不如直接内存定义一个变量获取他返回值,你一直使用你存的这个变量撒。
张天星 2018-10-16
  • 打赏
  • 举报
回复
引用 1 楼 hdt 的回复:
返回值是左值,无法改。除非改方法本身

那怎么把方法换掉,就是我自己在测试代码里面,简单的重写一个StaticDb.GetDb()方法,测试的时候,让这个重写的方法去替换原本复杂的静态方法。
有这个想法,但我不知道怎么替换。。
张天星 2018-10-16
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
下回你要把 GetDb 大小写给改一下,怎么办啊?

实际上有些想法根本没有必要。

GetDb 是公开方法,这个不会改名字啊。。。
主要是,我们要求大部分public 方法都要做单元测试,确保代码安全。
然后我遇到了种种问题。。。
  • 打赏
  • 举报
回复
下回你要把 GetDb 大小写给改一下,怎么办啊? 实际上有些想法根本没有必要。
真相重于对错 2018-10-16
  • 打赏
  • 举报
回复
返回值是左值,无法改。除非改方法本身

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧