@BeforeEach
  public void setup() {
    transitionProtocolSchedule =
        spy(
            new TransitionProtocolSchedule(
                preMergeProtocolSchedule, postMergeProtocolSchedule, mergeContext));
    transitionProtocolSchedule.setProtocolContext(protocolContext);
    cliqueBuilder.nodeKey(NodeKeyUtils.generate());
    cliqueBuilder.genesisConfig(GenesisConfig.DEFAULT);
    powBuilder.genesisConfig(GenesisConfig.DEFAULT);
    postMergeBuilder.genesisConfig(GenesisConfig.DEFAULT);
    postMergeBuilder.storageProvider(storageProvider);
    lenient().when(protocolContext.getBlockchain()).thenReturn(mockBlockchain);
    lenient()
        .when(transitionProtocolSchedule.getPostMergeSchedule())
        .thenReturn(postMergeProtocolSchedule);
    lenient()
        .when(transitionProtocolSchedule.getPreMergeSchedule())
        .thenReturn(preMergeProtocolSchedule);
    lenient()
        .when(protocolContext.getConsensusContext(CliqueContext.class))
        .thenReturn(mock(CliqueContext.class));
    lenient()
        .when(protocolContext.getConsensusContext(PostMergeContext.class))
        .thenReturn(mergeContext);
    lenient()
        .when(protocolContext.getConsensusContext(MergeContext.class))
        .thenReturn(mergeContext);
    when(ethProtocolManager.ethContext().getScheduler())
        .thenReturn(new DeterministicEthScheduler());
    miningConfiguration = MiningConfiguration.newDefault();
  }
We only bother testing transitionControllerBuilder for PoW and Clique since those are the only
network types that are transitioning to PoS.
app/src/test/java/org/hyperledger/besu/controller/TransitionControllerBuilderTest.java