class_docstr: FakeComponent that lets user overwrite input/output/exec_properties.
class_docstr_tok: ["FakeComponent","that","lets","user","overwrite","input\/output\/exec_properties","."]
code: def output(self, key: str, artifact_type=DummyArtifact):
      if key not in self._outputs:
          self._outputs[key] = channel_types.OutputChannel(
              artifact_type, self, key
          )
      return self._outputs[key]
  
imports: from typing import Type, Any, Dict, List, Optional, Sequence, Tuple, Union, Mapping
  from unittest import mock
  from absl.testing import parameterized
  from tfx import types
  from tfx.dsl.compiler import compiler_context
  from tfx.dsl.compiler import node_inputs_compiler
  from tfx.dsl.components.base import base_component
  from tfx.dsl.components.base import base_driver
  from tfx.dsl.components.base import base_executor
  from tfx.dsl.components.base import executor_spec
  from tfx.dsl.input_resolution import resolver_op
  from tfx.dsl.input_resolution.ops import ops_utils
  from tfx.orchestration import pipeline
  from tfx.proto.orchestration import pipeline_pb2
  from tfx.types import artifact
  from tfx.types import artifact_utils
  from tfx.types import channel
  from tfx.types import component_spec
  from tfx.utils import test_case_utils
  from tfx.utils import typing_utils
  import ml_metadata
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 2 for calling the FakeComponent obj's underlying member method code with example usage: obj.output(key, artifact_type) and returns: self