在单元测试中测试私有方法,通常不是推荐的做法,因为这些方法封装了类的内部实现细节,外部测试应该关注公共接口和行为。然而,如果确实需要测试私有方法,可以使用以下几种方法:
通过反射,可以访问和调用私有方法。
using System;
using System.Reflection;
using NUnit.Framework;
public class MyClass
{
private int PrivateMethod(int a, int b)
{
return a + b;
}
}
[TestFixture]
public class MyClassTests
{
[Test]
public void TestPrivateMethod()
{
var instance = new MyClass();
var method = typeof(MyClass).GetMethod("PrivateMethod", BindingFlags.NonPublic | BindingFlags.Instance);
int result = (int)method.Invoke(instance, new object[] { 1, 2 });
Assert.AreEqual(3, result);
}
}
如果私有方法的逻辑很重要,可以考虑将其改为受保护的方法,这样子类可以访问并进行测试。
public class MyClass
{
protected int ProtectedMethod(int a, int b)
{
return a + b;
}
}
[TestFixture]
public class MyClassTests
{
[Test]
public void TestProtectedMethod()
{
var instance = new MyClass();
int result = instance.ProtectedMethod(1, 2);
Assert.AreEqual(3, result);
}
}
通过测试替身(如存根、模拟对象等),可以间接测试私有方法的逻辑。
public class MyClass
{
private int PrivateMethod(int a, int b)
{
return a + b;
}
public int PublicMethod(int a, int b)
{
return PrivateMethod(a, b);
}
}
[TestFixture]
public class MyClassTests
{
[Test]
public void TestPublicMethod()
{
var instance = new MyClass();
int result = instance.PublicMethod(1, 2);
Assert.AreEqual(3, result);
}
}
如果私有方法的逻辑复杂且难以测试,可以考虑将其提取到一个单独的类中,并通过公共接口进行访问。
public class MyHelper
{
public int Add(int a, int b)
{
return a + b;
}
}
public class MyClass
{
private MyHelper helper = new MyHelper();
public int PublicMethod(int a, int b)
{
return helper.Add(a, b);
}
}
[TestFixture]
public class MyClassTests
{
[Test]
public void TestPublicMethod()
{
var instance = new MyClass();
int result = instance.PublicMethod(1, 2);
Assert.AreEqual(3, result);
}
}
尽管可以通过反射、更改访问修饰符、使用测试替身或重构代码来测试私有方法,但通常建议关注公共接口和行为。这样可以更好地遵循单一职责原则,提高代码的可维护性和可测试性。
领取专属 10元无门槛券
手把手带您无忧上云