我被分配了一个单元测试任务的任务,我从未直接用JUnit工作,并且严格禁止更改包中的代码.这通常没有问题,因为我们的大多数单元测试只是为了功能和输入/输出的一致性,这可以通过运行例程并检查它们的返回值来完成.
但是,偶尔需要检查类中的私有变量,或者直接编辑私有变量以检查某些内部行为.有没有办法获得访问这些,无论是通过JUnit或任何其他方式,为了单元测试而不实际更改原始源包中的任何代码?如果没有,那么程序员如何在现实世界中处理这个问题,而单元测试人员可能与编码器不同?
我有一个单元测试课Tester; 我希望它访问Working类的私有字段.
class Working {
// ...
private:
int m_variable;
};
class Tester {
void testVariable() {
Working w;
test( w.m_variable );
}
}
Run Code Online (Sandbox Code Playgroud)
我有以下选择:
public- 丑陋test_getVariable()- 过于复杂friend class Tester到工作 - 然后明确地工作"知道"测试器,这是不好的我的理想是
class Working {
// ...
private:
int m_variable;
friend class TestBase;
};
class TestBase {};
class Tester : public TestBase {
void testVariable() {
Working w;
test( w.m_variable );
}
}
Run Code Online (Sandbox Code Playgroud)
Working知道TestBase而不是每个测试......但它不起作用.显然友谊不适用于继承.
这里最优雅的解决方案是什么?
任何人都可以用一种建议的方法来指导我测试通过公共方法修改的类中的私有字段.我已经阅读了很多人的意见,建议不建议测试私有成员,因为它们是实现的内部,但是这种情况似乎与大多数其他答案不同.
我正在考虑使私有字段受到保护并创建一个公开该字段的测试子类,但如果我无法修改该类的内部,该怎么办?
在下面的示例代码中,要测试的私有成员将是_values,它是一个只写集合,通过AddValue()接收新值.
public class Sample
{
private Dictionary<string, string> _values;
private DateTime _created;
public Sample()
{
_values = new Dictionary<string, string>();
_created = DateTime.Now;
}
public void AddValue(string key, string value)
{
_values.Add(key, value);
}
}
Run Code Online (Sandbox Code Playgroud) 如何为私有函数的out参数创建单元测试?
我的服务层:
private int LoadProduct(string productId, out IProduct product)
{
product = this.Load(productId);
return ErrorCodes.Success;
}
Run Code Online (Sandbox Code Playgroud)
测试用例:
[Test]
public void LoadProductTest()
{
var offerService = new OfferProcessor();
var privateOfferService = new PrivateObject(offerService);
IProduct myProduct = null;
var result = (int)privateOfferService.Invoke("LoadProduct",
new object[] {"AnId", myProduct });
Assert.That(result, Is.EqualTo(ErrorCodes.Success));
Assert.That(myProduct, Is.NotNull());
}
Run Code Online (Sandbox Code Playgroud)
上面的测试用例没有编译.如何通过调用out参数然后在调用后访问它?