yeg
2026-09-29 b78295e8da96c3e5e76befeef9582ce5273dbb74
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.battery.business.service.impl;
 
import static org.junit.jupiter.api.Assertions.assertTrue;
 
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import com.battery.device.api.TestDataObservationAdapter;
 
/**
 * 取数入口的装配契约:开发模拟器既是 Spring Bean,又实现了测试数据观测契约,
 * 所以业务侧注入的那个 Bean 必须显式声明为首选,否则上下文里出现两个候选会启动失败。
 * 这里断言的是"哪个 Bean 会被注入"这个结构性事实,而不是 Spring 内部行为。
 */
class RoutingAdapterWiringContractTest
{
    @Test
    void routingAdapterIsThePreferredTestDataObservationBean()
    {
        assertTrue(TestDataObservationAdapter.class.isAssignableFrom(RoutingTestDataObservationAdapter.class));
        assertTrue(RoutingTestDataObservationAdapter.class.isAnnotationPresent(Service.class),
                "取数入口必须是可注入的 Bean");
        assertTrue(RoutingTestDataObservationAdapter.class.isAnnotationPresent(Primary.class),
                "来源实例自己也实现该契约时必须显式首选路由入口,否则注入出现两个候选");
    }
 
    @Test
    void developmentSimulatorAlsoExposesTheContractWhichIsWhyPreferenceIsNeeded()
    {
        assertTrue(TestDataObservationAdapter.class
                .isAssignableFrom(com.battery.device.simulator.BtsDevelopmentSimulator.class));
    }
}