2011-08-23 54 views
0

我有一个工厂类,它根据它接收的参数创建一个对象。该参数是一个标识符,告诉它应该创建哪个对象。 其第一步是使用数据访问层为对象提取信息。 下一步是对数据进行一些清理/转换。 最后,它创建所需的对象并将其返回。如何在无法访问状态时测试对象?

我想确保清理/转换步骤正常,但它返回的对象不会公开任何状态,所以我不知道如何轻松测试。

数据访问层和数据库结构无法更改,因为它们必须使用遗留代码。

对象被使用后,我可以在系统中进一步测试它,但这会导致难以维护的大测试。

我也想过暴露对象的状态,或将责任放在另一个类中,然后测试它,但这两个选项看起来像是在更改系统进行测试。

有关其他测试方法的想法吗?

+0

分享一些代码。 –

+0

您不能直接自己创建对象吗?如果没有工厂类,请调用清理/转换方法并检查结果? –

+0

我无法做到这一点。工厂类的目的是封装对象的创建。这使我可以在必要时切换对象的创建方式。 – johnB

回答

2

这听起来像你试图在单元测试中测试太多。

这是您单位试图做得太多的症状。

你正试图在这里做三件事。

  1. 从数据访问层获取数据。
  2. 清理数据。
  3. 构建对象

要解决,你建议我将这些责任转移到自己的单位(类/方法)。然后你可以自己测试每个单元。

由于您不想更改系统进行测试,因此您很犹豫。然而,单元测试的优点在于它突出了设计中的缺陷。您不仅要更改系统进行测试,还要改进系统并使其更细化,从而更易于维护和重用。

1

您的工厂对象试图在这里做太多。我建议重构代码,将清理数据的责任交给另一个对象,并测试该对象的行为。

我还以为揭露对象的状态,或将在另一大类 责任和测试的,但是这两个 选择似乎像我改变系统进行测试。

没错,您正在更改系统进行测试。这是一件好事。这是测试驱动设计的一个例子,通过强迫你降低课程责任的路径,推动更好的设计展现更宽松的耦合和更高的凝聚力。 (理想情况下,每个班只有just one responsibility。)这是TDD的主要优势之一,所以不要与之抗争。

0

我知道两种实现方法: - 使用反射在Java中。 - (以及最好的IMO)编程侧重于接口,因此您可以实现可以访问数据的接口。