Oop 当我可以';t访问状态?

Oop 当我可以';t访问状态?,oop,tdd,tell-dont-ask,Oop,Tdd,Tell Dont Ask,我有一个factory类,它根据接收到的参数创建一个对象。参数是一个标识符,告诉它应该创建哪个对象。 它的第一步是使用数据访问层为对象提取信息。 它的下一步是对数据进行一些清理/转换。 最后,它创建所需的对象并返回它 我想确保清理/转换步骤正常进行,但它返回的对象没有暴露任何状态,因此我不确定如何轻松测试它 数据访问层和数据库结构不能更改,因为它们必须使用遗留代码 我可以在对象使用后在系统中进一步测试它,但这将导致难以维护的大型测试 我还想过公开对象的状态,或者将责任放在另一个类中并进行测试,但

我有一个factory类,它根据接收到的参数创建一个对象。参数是一个标识符,告诉它应该创建哪个对象。 它的第一步是使用数据访问层为对象提取信息。 它的下一步是对数据进行一些清理/转换。 最后,它创建所需的对象并返回它

我想确保清理/转换步骤正常进行,但它返回的对象没有暴露任何状态,因此我不确定如何轻松测试它

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

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

我还想过公开对象的状态,或者将责任放在另一个类中并进行测试,但这两个选项似乎都在改变测试系统


有没有其他方法来测试类似的东西的想法?

在我看来,您似乎试图在单元测试中测试太多

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

你在这里试着做三件事

  • 从数据访问层获取数据
  • 清理数据
  • 构建对象
  • 为了解决这个问题,我会按照您的建议,将这些职责转移到它们自己的单元(类/方法)中。然后您可以单独测试每个单元


    您不愿意这样做,因为您不想更改系统进行测试。然而,单元测试的优势在于它突出了设计中的缺陷。您不仅在为测试而更改系统,而且在改进它,使其更细粒度,从而更易于维护和重用

    在我看来,您似乎试图在单元测试中测试太多内容

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

    你在这里试着做三件事

  • 从数据访问层获取数据
  • 清理数据
  • 构建对象
  • 为了解决这个问题,我会按照您的建议,将这些职责转移到它们自己的单元(类/方法)中。然后您可以单独测试每个单元


    您不愿意这样做,因为您不想更改系统进行测试。然而,单元测试的优势在于它突出了设计中的缺陷。您不仅在为测试而更改系统,而且在改进它,使其更细粒度,从而更易于维护和重用

    您的factory对象试图在此处执行太多操作。我建议重构您的代码,让它负责清理另一个对象的数据,并测试该对象的行为

    我还考虑过暴露对象的状态,或者将 在另一个类中的责任和测试,但这两个 选项似乎我正在更改系统以进行测试


    没错,您正在更改系统以进行测试。这是一件好事。这是一个测试驱动设计的例子,它通过强迫您减少类的责任来驱动更好的设计,从而表现出更松散的耦合和更高的内聚性。(理想情况下,每个类只能有。)这是TDD的关键好处之一,所以不要反对它

    您的factory对象试图在此处执行太多操作。我建议重构您的代码,让它负责清理另一个对象的数据,并测试该对象的行为

    我还考虑过暴露对象的状态,或者将 在另一个类中的责任和测试,但这两个 选项似乎我正在更改系统以进行测试


    没错,您正在更改系统以进行测试。这是一件好事。这是一个测试驱动设计的例子,它通过强迫您减少类的责任来驱动更好的设计,从而表现出更松散的耦合和更高的内聚性。(理想情况下,每个类只能有。)这是TDD的关键好处之一,所以不要反对它

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

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

    如果没有factory类,您不能直接创建对象,调用清理/转换方法并检查结果吗?我做不到。工厂类的目的是封装对象的创建。这允许我在必要时切换对象的创建方式;但是状态的改变应该引起其行为的改变(该对象上的某些方法的行为应该不同)。在测试中,检查状态为X时的预期行为。如果没有factory类,您不能直接创建对象,调用清理/转换方法并检查结果吗?我不能这样做。工厂类的目的是封装对象的创建。这允许我在必要时切换对象的创建方式;但是状态的改变应该引起其行为的改变(该对象上的某些方法的行为应该不同)。在测试中,检查状态为X时的预期行为。