Java 使用@PostConstruct模拟类会导致初始化失败

Java 使用@PostConstruct模拟类会导致初始化失败,java,spring,unit-testing,junit,mockito,Java,Spring,Unit Testing,Junit,Mockito,我有一个java程序,看起来像这样: public abstract class AbstractA { @Autowired protected B b; } @Component public class A extends AbstractA { private C c; @PostConstruct public void initilizeC() { c = b.getInternalMember(); } } @Component public

我有一个java程序,看起来像这样:

public abstract class AbstractA {
  @Autowired
  protected B b;
}

@Component
public class A extends AbstractA {
  private C c;

  @PostConstruct
  public void initilizeC() {
    c = b.getInternalMember();
  }
}

@Component
public class D {
  @Autowired
  private A a;
}

@Component
public class E {
  @Autowired
  private D d;
}
@ContextConfiguration(location = {"file:unit-test.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class ETest {
  //class E(being tested) internally uses method of D
  @Autowired
  private A a;

  @Test
  public void methodOfETest() {
    Mockito.when(a.methodOfC(anyInt())).thenReturn(1);
  }

  @After
  public void resetMocks() {
    Mockito.reset(a);
  }
}
我的测试类如下所示:

public abstract class AbstractA {
  @Autowired
  protected B b;
}

@Component
public class A extends AbstractA {
  private C c;

  @PostConstruct
  public void initilizeC() {
    c = b.getInternalMember();
  }
}

@Component
public class D {
  @Autowired
  private A a;
}

@Component
public class E {
  @Autowired
  private D d;
}
@ContextConfiguration(location = {"file:unit-test.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class ETest {
  //class E(being tested) internally uses method of D
  @Autowired
  private A a;

  @Test
  public void methodOfETest() {
    Mockito.when(a.methodOfC(anyInt())).thenReturn(1);
  }

  @After
  public void resetMocks() {
    Mockito.reset(a);
  }
}
我的spring文件(仅捕获bean初始化)

根据评论,我能够使用@Qualifier并使测试用例正常工作。但我仍然有兴趣了解@PostConstruct在模仿时是如何工作的

你能帮我找到以下问题的答案吗

  • @PostConstruct注释的方法在模拟时如何工作
  • 在我的例子中,类A、B和C属于不同的包。因此,我需要嘲笑他们。 3.1. 为什么仅仅嘲笑一个人还不够? 3.2. 为什么我要理解A的内部结构,还要模拟底层/依赖类

  • 提前谢谢

    如果在加载上下文之前进行模拟,则应该能够这样做。像这样的

    public static class ContextLoader extends GenericXmlContextLoader {
        @Override
        protected void customizeContext(GenericApplicationContext context) {
            super.customizeContext(context);
            // Add mock for A in context here
        }
    }
    

    如果在加载上下文之前进行模拟,则应该能够这样做。像这样的

    public static class ContextLoader extends GenericXmlContextLoader {
        @Override
        protected void customizeContext(GenericApplicationContext context) {
            super.customizeContext(context);
            // Add mock for A in context here
        }
    }
    

    可能是Hi Gergely的复制品,这个链接确实有帮助。我现在可以运行测试了。但是,我仍然想了解@PostConstruct方法是如何初始化的。“B的类路径”:我想你是指B的类名?嗨,Adrian,不是。这是“B的类路径”,可能是Hi Gergely的重复,链接确实有帮助。我现在可以运行测试了。但是,我仍然想了解@PostConstruct方法是如何初始化的。“B的类路径”:我想你是指B的类名?嗨,阿德里安,不是。这是“B的类路径”,嗨,苏拉布,我不明白你的答案。请你详细解释一下好吗?嗨,苏拉布,我不明白你的答案。请你详细解释一下好吗?