code: def test_empty_attribute(
      self,
      missing_attribute,
      project_id,
      instance_id,
      table_id,
      mock_hook,
      soft_fail,
      expected_exception,
  ):
      with pytest.raises(expected_exception) as ctx:
          BigtableTableReplicationCompletedSensor(
              project_id=project_id,
              instance_id=instance_id,
              table_id=table_id,
              task_id="id",
              gcp_conn_id=GCP_CONN_ID,
              impersonation_chain=IMPERSONATION_CHAIN,
              soft_fail=soft_fail,
          )
      err = ctx.value
      assert str(err) == f"Empty parameter: {missing_attribute}"
      mock_hook.assert_not_called()
  
file_path: airflow/tests/providers/google/cloud/sensors/test_bigtable.py
imports: from __future__ import annotations
  from unittest import mock
  import google.api_core.exceptions
  import pytest
  from google.cloud.bigtable.instance import Instance
  from google.cloud.bigtable.table import ClusterState
  from airflow.exceptions import AirflowException, AirflowSkipException
  from airflow.providers.google.cloud.sensors.bigtable import BigtableTableReplicationCompletedSensor
label_desc: Use image node_id 1 for calling the BigtableWaitForTableReplicationTest obj's underlying member method code with example usage: obj.test_empty_attribute(missing_attribute, project_id, instance_id, table_id, mock_hook, soft_fail, expected_exception) without return types